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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://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的
[root@Hadoop elk]# whereis logstash
logstash: /etc/logstash /opt/logstash/bin/logstash /opt/logstash/bin/logstash.bat
[root@Hadoop elk]# cd /opt/logstash/bin
[root@Hadoop bin]# ll
total 36
-rwxrwxr-x. 1 logstash logstash 1046 Aug 20  2015 logstash
-rw-rw-r--. 1 logstash logstash  689 Aug 20  2015 logstash.bat
-rwxrwxr-x. 1 logstash logstash 4107 Aug 20  2015 logstash.lib.sh
-rwxrwxr-x. 1 logstash logstash  439 Aug 20  2015 plugin
-rw-rw-r--. 1 logstash logstash  251 Aug 20  2015 plugin.bat
-rwxrwxr-x. 1 logstash logstash  322 Aug 20  2015 rspec
-rw-rw-r--. 1 logstash logstash  245 Aug 20  2015 rspec.bat
-rw-rw-r--. 1 logstash logstash 2165 Aug 20  2015 setup.bat

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

mkdir config

vim  log4j_to_es.conf

在这里面插入如下内容:

input {
  tcp {
        port => 4567
      }
}

filter {
}

output {
  stdout {
         codec => rubydebug
         }
}
其意思就是,开放本地的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依赖
		<!-- Logstash encoder -->
		<dependency>
			<groupId>net.logstash.logback</groupId>
			<artifactId>logstash-logback-encoder</artifactId>
			<version>4.4</version>
		</dependency>
再在logback.xml中添加如下内容:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are  by default assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <param name="Encoding" value="UTF-8"/>
        <remoteHost>192.168.31.222</remoteHost>
        <port>4567</port>
        <!-- encoder is required -->
        <encoder class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>

    <root level="info">
        <appender-ref ref="logstash" />
        <appender-ref ref="STDOUT" />
    </root>

</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就好!
[root@Hadoop config]# vim log4j_to_es.conf 
input {
  tcp {
        port => 4567
        }
}

filter {
}

output {
  elasticsearch { host => localhost }
  stdout {
         codec => rubydebug
         }
}

~
~
~
~
~
~
~
~
~
~
~
~
~
~
:wq   

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


启动完成后,在JAVAEE项目中输出几条日志,然后再在kibana中查询一下
为了测试方便,我在javaee工程中新建了一个controller,用它来打印日志
@Controller
@RequestMapping("test")
public class TestController {
	private Logger logger = LoggerFactory.getLogger(getClass());
	private static int i = 0;

	@RequestMapping(value = "hello")
	public ResponseEntity<?> helloWorld() {
		logger.debug("[ResponseEntity]:{}", "i am debug" + i);
		logger.info("[ResponseEntity] i am info" + i);
		logger.error("[ResponseEntity]i am error" + i);
		logger.warn("[ResponseEntity]i am warn" + i);
		i++;
		String responseStr = "OK";
		ResponseEntity<String> responseEntity = new ResponseEntity<>(responseStr, HttpStatus.OK);
		return responseEntity;
	}
}
启动测试的WEB工程后,访问测试的controller,并在kibana中查看下日志



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

展开阅读全文

没有更多推荐了,返回首页