LogStash架构专为收集、分析和存储日志所设计,正适合分布式系统,因此我根据官方文档和网上经验搭建了这个平台。
- 安装环境
- 平台架构
采用LogStash的官方推荐
- 环境规划
- 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
- 必要组件
- 安装步骤
- 在10.2.169.64安装并启动Redis
# wget http://redis./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
# cp src/redis-server src/redis-cli src/redis-benchmark src/redis-sentinel src/redis-check-dump src/redis-check-aof bin/
# cp redis.conf etc/
§ 配置参数
# 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
dbfilename dump.rdb
dir /usr/local/redis/var/
appendonly no
appendfsync always
§ 启动
# bin/redis-server etc/redis.conf
- 在10.2.169.234安装并启动ElasticSearch
- 下载解压,可到官网直接下载,也可使用wget。
# cd /usr/local
# wget https://download./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
- 在10.2.169.234安装并启动LogStash
# curl -O https://download./logstash/logstash/logstash-1.4.1.tar.gz
# tar -xzvf logstash-1.4.1
- 创建软连接。
这里是个人习惯,以后版本变迁的时候便于升级,可以跳过,但如果跳过的话下面相应的目录就要变更。
# ln -s logstash-1.4.1 logstash
- 创建配置文件
# cd logstash
# mkdir conf
# 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 => 端口
# bin/logstash -f conf/redis.conf
-l /data/logs/logstash.log &
其中-f是指以指定的配置文件启动,-l是设置logstash本身的日志位置。&是以守护进程方式启动。
- 启动logstash web
# bin/logstash-web
- 在10.2.169.21/10.2.169.22....安装并启动LogStash agent 这里的机器就是我们应用部署的各台机器了。这里的步骤与logstash index的步骤差不多,差异除了不用启动logstash web外,主要有两个。
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 <xxx-saas@xxx.com>: Sender address rejected: not owned by user paymonitor@xxx.com
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 <xxx-saas@xxx.com>: Sender address rejected: not owned by user paymonitor@xxx.com
at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1047)
15 more
如果不加fitler,那采集来的message就是单独的一条。所以这里我配置了一个fitler,所有不是以2014开头(这里演示我偷了一下懒,应该用正则)的都并到上一条。
output就是输入到我们的redis服务器。
# bin/logstash -f conf/redis.conf
-l /data/logs/logstash.log &
- 查看和搜索日志
打开浏览器,输入以下地址:
http://10.2.169.234:9292/index.html#/dashboard/file/logstash.json
即可看到如下界面。
这个界面可以设置各种检索条件,就不细说了。
到此为止,整个平台就搭建完毕。当然,这三者的功能不仅仅只有这么一点,而是能够提供更有趣的日志分析,大家可以自己研究。