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
来查看访问日志。