使用logstash+kibana+elasticsearch+redis搭建集中式日志分析平台

发布时间:2014-05-30 15:20:21

搭建logstash+kibana+elasticsearch+redis搭建集中式日志分析平台

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 : 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 : 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服务器。

启动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

即可看到如下界面。

这个界面可以设置各种检索条件,就不细说了。

到此为止,整个平台就搭建完毕。当然,这三者的功能不仅仅只有这么一点,而是能够提供更有趣的日志分析,大家可以自己研究。

使用logstash+kibana+elasticsearch+redis搭建集中式日志分析平台

相关推荐