使用logstash+kibana+elasticsearch+redis搭建集中式日志分析平台
发布时间:2014-05-30 15:20:21
发布时间:2014-05-30 15:20:21
LogStash架构专为收集、分析和存储日志所设计,正适合分布式系统,因此我根据官方文档和网上经验搭建了这个平台。
1. 安装环境
1. 平台架构
采用LogStash的官方推荐
2. 环境规划
▪ 10.2.169.64(CentOS5.5):Broker
▪ 10.2.169.234(CentOS5.5):Indexer,Storage&Search,Web Interface
▪ 10.2.169.21/10.2.169.22....(CentOS5.5):Shiper
3. 必要组件
▪ JDK
2. 安装步骤
1. 在10.2.169.64安装并启动Redis
▪ 下载解压
# cd /usr/local
# wget http://redis.googlecode.com/files/redis-2.6.14.tar.gz
# tar -xzvf redis-2.6.14.tar.gz
▪ 创建软链接(非必须)
这里是个人习惯,以后版本变迁的时候便于升级,可以跳过,但如果跳过的话下面相应的目录就要变更。
# ln -s redis-2.6.14 redis
▪ 编译
# cd redis
# make
▪ 建立Redis目录(非必须)
这步只是习惯将Redis相关的资源统一管理,可以跳过。
# mkdir -p bin
# mkdir -p etc
# mkdir -p var
# cpsrc/redis-server src/redis-cli src/redis-benchmark src/redis-sentinel src/redis-check-dump src/redis-check-aof bin/
# cpredis.confetc/
▪ 配置参数
# vi etc/redis.conf
对redis.conf做如下变更
daemonize yes
pidfile /usr/local/redis/var/redis.pid
port 6379
timeout 300
loglevel debug
logfile /usr/local/redis/var/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilenamedump.rdb
dir /usr/local/redis/var/
appendonly no
appendfsync always
▪ 启动
# bin/redis-server etc/redis.conf
2. 在10.2.169.234安装并启动ElasticSearch
▪ 下载解压,可到官网直接下载,也可使用wget。
# cd /usr/local
# wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.1.1.tar.gz
# tar -zxvf elasticsearch-1.1.1.tar.gz
▪ 创建软连接。
这里是个人习惯,以后版本变迁的时候便于升级,可以跳过,但如果跳过的话下面相应的目录就要变更。
# ln -s elasticsearch-1.1.1 elasticsearch
▪ 这里我们使用默认配置,直接启动。
# elasticsearch/bin/elasticsearch
3. 在10.2.169.234安装并启动LogStash
▪ 下载并解压Logstash。
# curl -O https://download.elasticsearch.org/logstash/logstash/logstash-1.4.1.tar.gz
# tar -xzvf logstash-1.4.1
▪ 创建软连接。
这里是个人习惯,以后版本变迁的时候便于升级,可以跳过,但如果跳过的话下面相应的目录就要变更。
# ln -s logstash-1.4.1 logstash
▪ 创建配置文件
# cd logstash
# mkdirconf
# vi conf/redis.conf
内容如下
input {
redis {
host => '10.2.169.64'
data_type => 'list'
port => "6379"
key => 'logstash:redis'
type => 'redis-input'
}
}
output {
elasticsearch {
host => "127.0.0.1"
}
}
解释一下 logstash的配置文件由 input filter output 等几个基本的部分组成,顾名思义 input 就是在哪收集数据,output就是输出到哪,filter代表一个过滤规则意思是什么内容
会被收集。
上面这段是让 logstash 去10.2.169.64 这个redis服务器上去收集日志 redis端口为6379,key是 logstash:redis 类型为 redis-input ,(注意:这几个值必须跟logstash agent的
output 所对应),收集完成后输出到 elasticsearch ,如果elasticsearch有更改端口,需要将这条改为
host => 'elasticsearch的ip' port => 端口
▪ 启动logstash index
# bin/logstash -f conf/redis.conf
-l /data/logs/logstash.log &
其中-f是指以指定的配置文件启动,-l是设置logstash本身的日志位置。&是以守护进程方式启动。
▪ 启动logstash web
# bin/logstash-web
4. 在10.2.169.21/10.2.169.22....安装并启动LogStash agent 这里的机器就是我们应用部署的各台机器了。这里的步骤与logstash index的步骤差不多,差异除了不用启动logstash web外,主要有两个。
▪ redis.conf的配置内容。
input {
file {
type => "dev_integrate"
path => "/data/logs/integrate/integrate.log"
}
file {
type => "dev_custom"
path => "/data/logs/custom/custom.log"
}
}
filter {
multiline {
pattern => "^[^2014]"
what => "previous"
}
}
output {
redis {
host => '10.2.169.64'
data_type => 'list'
key => 'logstash:redis'
}
}
其中input指定了本机部署的两个应用的log文件。type是我自定义的一个类型,用来在后面的UI中区分各应用,path就是log文件路径了。如果有更多应用,照格式添加即可。
filter用来处理log中的error信息,因为我的应用java程序,部署在tomcat下,所以错误信息类似如下:
2014-05-27 02:17:16 [emailJMSContainer-1] ERROR com.xxx.xxx.email.EmailSender.errorLog(79)): - exception occurred:
javax.mail.SendFailedException: Invalid Addresses;
nested exception is:
com.sun.mail.smtp.SMTPAddressFailedException: 553 5.7.1
at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1196)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:584)
at javax.mail.Transport.send0(Transport.java:169)
at javax.mail.Transport.send(Transport.java:98)
at com.xxx.communication.email.EmailSender.sendEmail(EmailSender.java:97)
at com.xxx.notification.EmailNotificationConsumer.processTxtMsg(EmailNotificationConsumer.java:24)
at com.xxx.asyncmsg.consumer.AbstractConsumer.onMessage(AbstractConsumer.java:78)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:562)
at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:500)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:468)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:326)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:264)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1071)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1063)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:960)
at java.lang.Thread.run(Thread.java:662)
Caused by: com.sun.mail.smtp.SMTPAddressFailedException: 553 5.7.1
at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1047)
15 more
如果不加fitler,那采集来的message就是单独的一条。所以这里我配置了一个fitler,所有不是以2014开头(这里演示我偷了一下懒,应该用正则)的都并到上一条。
output就是输入到我们的redis服务器。
▪ 启动agent
# bin/logstash -f conf/redis.conf
-l /data/logs/logstash.log &
3. 查看和搜索日志
打开浏览器,输入以下地址:
http://10.2.169.234:9292/index.html#/dashboard/file/logstash.json
即可看到如下界面。
这个界面可以设置各种检索条件,就不细说了。
到此为止,整个平台就搭建完毕。当然,这三者的功能不仅仅只有这么一点,而是能够提供更有趣的日志分析,大家可以自己研究。