日志分析利器elk与logback(log4j)实战

来源:互联网 发布:大数据建设 一流公司 编辑:程序博客网 时间:2024/06/16 04:31

原文地址:http://blog.csdn.net/puhaiyang/article/details/69664891

在近期的项目中,由于其项目中记录了许多日志,当系统由于某些BUG挂掉时,单纯地通过命令来查询错误日志很不方便排除,且搜索起来很非常不方便,很花费时间,对于一向不喜欢干重复单调很费时间的我来说,如果没有一种办法来解决日志问题是一件很痛苦的事情。那天偶然,公司的CTO说解决这种事情,只需要ELK就能解决掉了(CTO果然见多识广),对于一向喜欢新技术的我来说,我便在网上搜索了一些关于ELK的知识,正好今天周六,我将此记录一下,为方便以后查看和快速安装ELK。

首先ELK到底是什么呢?通过在网上查询相关信息了解到,其实ELK是由Elasticsearch、Logstash、Kibana这3个软件的缩写。

在以前的项目中日志的处理流程大致是这样的:先由我们自己开发的系统产生出日志,由其日志框架进行处理,(在JAVAEE中这些日志框架如log4j,slf4j,logback)通过日志框架将日志打印到控制台或输出到指定的文件中,当我们需要对日志文件进行查看时,通过vim等工具进行查看。

L

那么有了ELK之后,其日志的处理流程就是在其上所述的基础上,日志处理框架在输出日志信息的时候,还将日志输出到一个开放了TCP端口的程序中,那么在ELK中,这个用于收集日志的程序便是Logstash,在Logstash收集到日志信息后,Logstash这个程序可以将这些日志再次包装一下,也可以直接输出到Elasticsearch这个程序中。

E

Elasticsearch这个名字猜想出,它是一个和搜索相关的程序,事实上也是这样的,Elasticsearch是一个基于Lucene的搜索服务器,能在很快的时间内检索出你所想要查询的信息。

K

Kibana是什么呢?个人理解的话,Kibana是一个用于操作Elasticsearch的一个图形化界面,通过Kibana这个WEB界面,使得对于Elasticsearch的数据的检索变得非常方便。

ELK流程

所有总结起来,ELK的流程应该是这样的:Logback->Logstash->(Elasticsearch<->Kibana)

由我们自己的程序产生出日志,由日志框架进行处理,将日志数据输出到Logstash中,Logstash再将数据输出到Elasticsearch中,Elasticsearch再与Kibana相结合展示给用户。

ELK搭建过程

软件准备

在这里,以Centos7服务器为例,记录下其ELK的搭建过程。

首先在服务器上下载好以下安装包:

logstash-1.5.4-1.noarch.rpm
elasticsearch-1.7.3.noarch.rpm
kibana-4.1.2-Linux-x64.tar.gz

当然,由于以上软件的运行环境为Java,所以得要提前安装好JDK。我这里安装的是JDK1.8,并设好环境变量及JAVA_HOME



Logstash安装

[root@Hadoop elk]# yum localinstall logstash-1.5.4-1.noarch.rpm

一直y 待安装完成后,看看安装到哪里了,并配置下log4j的
[plain] view plain copy
  1. [root@Hadoop elk]# whereis logstash  
  2. logstash: /etc/logstash /opt/logstash/bin/logstash /opt/logstash/bin/logstash.bat  
  3. [root@Hadoop elk]# cd /opt/logstash/bin  
  4. [root@Hadoop bin]# ll  
  5. total 36  
  6. -rwxrwxr-x. 1 logstash logstash 1046 Aug 20  2015 logstash  
  7. -rw-rw-r--. 1 logstash logstash  689 Aug 20  2015 logstash.bat  
  8. -rwxrwxr-x. 1 logstash logstash 4107 Aug 20  2015 logstash.lib.sh  
  9. -rwxrwxr-x. 1 logstash logstash  439 Aug 20  2015 plugin  
  10. -rw-rw-r--. 1 logstash logstash  251 Aug 20  2015 plugin.bat  
  11. -rwxrwxr-x. 1 logstash logstash  322 Aug 20  2015 rspec  
  12. -rw-rw-r--. 1 logstash logstash  245 Aug 20  2015 rspec.bat  
  13. -rw-rw-r--. 1 logstash logstash 2165 Aug 20  2015 setup.bat  

然后建立一个logstash的配置文件

mkdir config

vim  log4j_to_es.conf

在这里面插入如下内容:

[plain] view plain copy
  1. input {  
  2.   tcp {  
  3.         port => 4567  
  4.       }  
  5. }  
  6.   
  7. filter {  
  8. }  
  9.   
  10. output {  
  11.   stdout {  
  12.          codec => rubydebug  
  13.          }  
  14. }  
其意思就是,开放本地的4567端口,通过此端口接收日志数据

output代表输出,将日志数据输出配置 stdout codec代表按照rubydebug方式把日志包装下

然后再启动下logstash,为了省事,先防火墙关掉

[root@Hadoop ping]# systemctl stop firewalld

然后再执行启动,并以config目录下的log4j_to_es.conf为配置文件

[root@hadoop bin]# ./logstash -f config/log4j_to_es.conf 


提示startup completed就证明启动OK了!

Logback配置

logstash的配置已经好了之后,我再测试下,能否把JAVAEE的日志输出到logstash上去呢。
先添加jar包的maven依赖
[html] view plain copy
  1. <!-- Logstash encoder -->  
  2. <dependency>  
  3.     <groupId>net.logstash.logback</groupId>  
  4.     <artifactId>logstash-logback-encoder</artifactId>  
  5.     <version>4.4</version>  
  6. </dependency>  
再在logback.xml中添加如下内容:
[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <configuration>  
  3.     <include resource="org/springframework/boot/logging/logback/base.xml"/>  
  4.   
  5.     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
  6.         <!-- encoders are  by default assigned the type  
  7.              ch.qos.logback.classic.encoder.PatternLayoutEncoder -->  
  8.         <encoder>  
  9.             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>  
  10.         </encoder>  
  11.     </appender>  
  12.   
  13.     <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">  
  14.         <param name="Encoding" value="UTF-8"/>  
  15.         <remoteHost>192.168.31.222</remoteHost>  
  16.         <port>4567</port>  
  17.         <!-- encoder is required -->  
  18.         <encoder class="net.logstash.logback.encoder.LogstashEncoder" />  
  19.     </appender>  
  20.   
  21.     <root level="info">  
  22.         <appender-ref ref="logstash" />  
  23.         <appender-ref ref="STDOUT" />  
  24.     </root>  
  25.   
  26. </configuration>  

其中remoteHost指定了logstash的IP地址,port为logstash的端口
这样就配置好了logback,然后再启动我们的程序,看看logstash是否能接收到日志数据。

OK!从logstash上可以看到logstash已经接收到数据了,这就证明成功了一大半,接下来配置下elasticsearch 和kibana就完了。

elasticsearch安装与配置

[root@Hadoop elk]# yum localinstall elasticsearch-1.7.3.noarch.rpm
# 重载所有修改过的配置文件
[root@Hadoop elk]# systemctl daemon-reload 
#设为开机启动
[root@Hadoop elk]# systemctl enable elasticsearch.service  
#开启elasticsearch
[root@Hadoop elk]# systemctl start elasticsearch.service

elasticsearch默认会开启9200端口,为了验证elasticsearch是否成功启动了,在浏览器上验证下


OK,显示为以上画面,证明启动OK了!
如果需要对elasticsearch的相关配置修改下,可以修改elasticsearch的配置文件
查询出elasticsearch的配置文件,再根据需要修改就好
rpm -qc elasticsearch


kibana安装与配置

#执行解压
[root@Hadoop elk]# tar -zxvf kibana-4.1.2-linux-x64.tar.gz 
修改配置文件

在kibana.yml中可以修改kibana的端口和要关联的elasticsearch地址


完成好后,wq保存下,然后启动kibana

执行kibana解压目录下的kibana就好
然后在浏览器中打开此安装服务器5601端口

Ok,证明kibana的启动也成功了。

ELK配置关联,并测试

在上面的安装中,为了测试方便,是分别对单个程序的安装,并没有将logstash收集到的日志转给elasticserach进行处理,所以最后再将logstash的配置文件修改下,重新启动下logstash就好!
[plain] view plain copy
  1. [root@Hadoop config]# vim log4j_to_es.conf   
  2. input {  
  3.   tcp {  
  4.         port => 4567  
  5.         }  
  6. }  
  7.   
  8. filter {  
  9. }  
  10.   
  11. output {  
  12.   elasticsearch { host => localhost }  
  13.   stdout {  
  14.          codec => rubydebug  
  15.          }  
  16. }  
  17.   
  18. ~  
  19. ~  
  20. ~  
  21. ~  
  22. ~  
  23. ~  
  24. ~  
  25. ~  
  26. ~  
  27. ~  
  28. ~  
  29. ~  
  30. ~  
  31. ~  
  32. :wq     

添加elasticsearch配置,制定host的位置,然后重新启动logstash 
[root@Hadoop bin]# ./logstash -f config/log4j_to_es.conf 


启动完成后,在JAVAEE项目中输出几条日志,然后再在kibana中查询一下
为了测试方便,我在javaee工程中新建了一个controller,用它来打印日志
[java] view plain copy
  1. @Controller  
  2. @RequestMapping("test")  
  3. public class TestController {  
  4.     private Logger logger = LoggerFactory.getLogger(getClass());  
  5.     private static int i = 0;  
  6.   
  7.     @RequestMapping(value = "hello")  
  8.     public ResponseEntity<?> helloWorld() {  
  9.         logger.debug("[ResponseEntity]:{}""i am debug" + i);  
  10.         logger.info("[ResponseEntity] i am info" + i);  
  11.         logger.error("[ResponseEntity]i am error" + i);  
  12.         logger.warn("[ResponseEntity]i am warn" + i);  
  13.         i++;  
  14.         String responseStr = "OK";  
  15.         ResponseEntity<String> responseEntity = new ResponseEntity<>(responseStr, HttpStatus.OK);  
  16.         return responseEntity;  
  17.     }  
  18. }  
启动测试的WEB工程后,访问测试的controller,并在kibana中查看下日志



OK!在kibana中也能看到了!ELK最简单的配置就这样完成了!

阅读全文
0 0