ELK是Elasticsearch、Logstash、kibana三个开源库的首字母缩写,这三个库的主要功能分别如下:Elasticsearch用于日志存储、分析、搜索等功能;Logstash主要用于收集、修改、传输日志; kibana用于可视化提供友好的数据分析界面。
本文使用docker搭建一个相对比较简单ELK日志系统,本文假设读者对以下知识有基本的了解:
- SpringBoot
- Logback
- Docker(docker-compress)
首先需需要有一个SpringBoot的工程来产生一些日志,这里直接延用以前的工程(AppBubbleBackend),如有兴趣可查看原文《SpringBoot集成gRPC微服务工程搭建实践》,工程的搭建和docker想着的知识就不做过多的补充了,本文所提到的ELK配置到放在AppBubbleBackend/scripts/elk目录下。
产生日志(Logback)
示例使用SpringBoot工程集成Logback日志库来产生日志,首先要引用相关信赖:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
</dependency>
logback-classic和logback-core是Logback提供的类库,logstash-logback-encoder提供一些类库来处理日志,主要用于格式化Logback的日志并发送到Logstash服务器。
配置好Logback依赖后,SpringBoot会自动使用Logback替换掉的默认日志系统, 这样只需要在配置下logstash-logback-encoder将日志正确的发送的Logstash就可以了。根据SpringBoot的日志管理模式在resources目录下新建一个logback-spring.xml的日志配置文件内容如下:
<configuration>
<springProperty scope="local" name="appname" source="spring.application.name"
defaultValue="undefined"/>
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>logstash:4560</destination>
<!-- encoder is required -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder" >
<customFields>{"appname":"${appname}"}</customFields>
</encoder>
</appender>
<root level="TRACE">
<appender-ref ref="logstash"/>
</root>
<logger name="com.bubble" level="TRACE"/>
<logger name="com.bubble.user" />
<logger name="com.bubble.common" />
</configuration>
以上配置文件使用net.logstash.logback.appender.LogstashTcpSocketAppender建立一个Appender,将destination设置为Logstash服务器的地址,并添加一个自定义参数appname后面再来介绍这个字段。
配置完依赖和Logback之后,日志都发送到LogstashTcpSocketAppender,它会处理日志并发送的Logstash服务器。
收集日志(Logstash)
上面提到过日志通过LogstashTcpSocketAppender处理并发送到Logstash服务器,接下来就需要配置一个Logstash来接收日志。Logstash的配置分为logstash.yml和pipeline两类配置,logstash.yml不需要太多的配置我们使用默认的配置就够了,pipeline的配置可以分为input、filter和output两个主要的配置模块,它们的主要功能分别为:input主要用来接收日志;filter用来修改日志;output将日志发送到目的地。
在logback-spring.xml日志配置文件中使用的LogstashTcpSocketAppender来发送日志并配置了Logstash的地址为logstash:4560所以在pipeline的配置中首先需要添加一个接收日志的input:
input {
tcp {
port => 4560
codec => json_lines
id => "main"
}
}
然后在添加一个output将日志发送到Elasticsearch:
output {
#stdout { codec => rubydebug { metadata => true } }
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "logstash-services-%{+YYYY.MM.dd}"
}
}
output使用elasticsearch这个插件并指定elasticsearch服务器地址,最后将index的名称设置logstash-services-%{+YYYY.MM.dd}的格式,这样index的名称将会是logstash-services-2019.03.18的形式。
Logstash的配置可参考官方文档:
存储日志(Elasticsearch)
Elasticsearch的配置相对于前面两个稍微复杂一些,此次主要测试目的直接使用默认的配置。将Elasticsearch启动后,如果Logstash配置正确就可以使用 Get Index API 来获取index的信息。
查看2019.03.16这条的index信息:
curl http://elasticsearch:9200/logstash-services-2019.03.16
因为在配置logback-spring.xml的时候,添加了一个自定义的参数appname所以可以通过使用appname来查询日志:
curl http://localhost:9200/logstash-*/_search?pretty -X GET -H 'Content-Type: application/json' -d '{"query":{"match":{"appname":{"query":"AppBubbleUserService"}}}}'
以上命令执行完后可看到类似如下输出,说明日志已经成功发送到elasticsearch:
{
"_index" : "logstash-services-2019.03.18",
"_type" : "doc",
"_id" : "6ksRj2kBJ7x4nqLIOHp6",
"_score" : 0.0011799411,
"_source" : {
"thread_name" : "main",
"@version" : "1",
"level" : "TRACE",
"appname" : "AppBubbleUserService",
"host" : "appbubblebackend_user_1.appbubblebackend_default",
"port" : 56952,
"level_value" : 5000,
"logger_name" : "org.springframework.boot.context.config.ConfigFileApplicationListener",
"@timestamp" : "2019-03-18T04:31:02.983Z",
"message" : "Skipped missing config classpath:/application-default.xml for profile default"
}
分析日志(kibana)
日志被成功发送到elasticsearch后就可以使用kibana来查看搜索日志了。添加一个简单的配置文件:
elasticsearch:
hosts:
- "http://elasticsearch:9200"
server:
name: "kibana"
host: 0.0.0.0
配置好elasticsearch服务器的地址,然后启动kibana再添加一个Index Patterns,依次点击
Management >> Index Patterns >> Create index pattern创建一个index pattern。
添加成功进入Discover页面,在下拉框中选择新建的index即可看到如下所示的输出日志:
kibana还有很多强大的功能,后续再来继续探索。
总结
使用elk处理分析日志相比较传统的日志处理方式可大大提高日志的检索效率,如果要在生产环境中使用还需要更加深入的学习和详细的配置方案。后续的学习和使用中会继续深入学习Elasticsearch、Logstash的相关知识,同时对不于不支持发送远程日志的工具后续会使用beats来接入日志系统, 如envoy或nginx就可以使用filebeat来将日志发送到Logstash来查看访问日志。