ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核心套件实现日志采集、分析、展示,但并非全部。Elasticsearch官网地址 。
Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。
Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。
Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据。
下面我们是分别在3台服务器上搭建的。
安装elasticsearch
拉取镜像
docker pull elasticsearch:7.6.0
Elasticsearch默认是集群模式,集群模式下对机器配置较高;因此我们这里使用单机版的部署作为示例。下面是启动命令:
docker run -d --restart=always --name es7 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.0
之后通过9200端口在浏览器上访问http://192.168.56.102:9200(需要开启外网访问权限),有信息返回则成功;像下面的信息:
{
"name" : "node-1",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "7jUr1QFPQcSbDGG4A4c5Og",
"version" : {
"number" : "7.6.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "7f634e9f44834fbc12724506cc1da681b0c3b1e3",
"build_date" : "2020-02-06T00:09:00.449973Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
注意:如果需要添加插件时,需要将容器的插件目录映射到实际的路径中或者通过命令(如安装ik分词器:
docker cp ik elasticsearch:/usr/share/elasticsearch/plugins/
)将其拷贝到容器中
如果机器内存过小会导致启动失败,在集群模式下容易遇到
安装kibana
kibana主要用于对elasticsearch的数据进行分析查看。注意选择的版本必须和elasticsearch的版本相同或者低,建议和elasticsearch的版本相同,否则会无法将无法使用kibana。
拉取kibana的docker镜像
docker pull kibana:7.6.0
创建kibana的配置:
mkdir -p /home/elk/config
vi /home/elk/config/kibana.yml
在里面添加如下配置
# Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
# elasticsearch的地址,多个使用逗号分割
elasticsearch.hosts: [ "http://192.168.56.102:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
# 语言选择为中文
i18n.locale: "zh-CN"
启动kibana:
docker run -d --restart=always --name kibana -v /home/elk/config/kibana.yml:/usr/share/kibana/config/kibana.yml -p 5601:5601 kibana:7.6.0
启动成功后访问5601端口即可进入kibana管理界面http://192.168.56.104:5601 。(进入后要求选择配置,直接选择自己浏览即可)
操作说明
刚进入系统时会有如下提示,任意选择即可:
创建索引模式,以便我们可以查看日志信息;
安装Logstash
logstash会将收到的日志信息推送到elasticsearch中。
拉取Logstash的镜像
docker pull logstash:7.6.0
创建logstash的日志处理配置文件logstash.conf
mkdir -p /home/elk/config
vi /home/elk/config/logstash.conf
添加如下配置:
input {
tcp{
port => 5044
codec => json_lines
}
}
filter {
mutate {
remove_field => ["logLevel", "stdoutOpen", "useLogStash", "logStashDestination"]
}
}
output {
#stdout {
# codec => rubydebug
#}
elasticsearch {
hosts => ["192.168.56.105:9200"]
index => "logstash-%{[env]}-%{[server_name]}-%{+YYYY.MM.dd}"
}
}
创建logstash的的es配置文件logstash.yml
vi /home/elk/config/logstash.yml
添加如下配置:
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.56.102:9200" ]
启动logstash,如果控制台没有错误日志信息则说明启动
docker run -di --restart=always -p 5044:5044 -v /home/elk/config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf -v /home/elk/config/logstash.yml:/usr/share/logstash/config/logstash.yml --name logstash logstash:7.6.0
Spring Boot中集成logstash
下面以springboot中使用logback作为日志处理工具;为了和各个环境兼容,我们采用动态日志配置的方式,因此需要挺添加如下依赖:
<!-- logstash需要的包 -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.3</version>
</dependency>
<!-- 动态日志配置功能需要的包 -->
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
</dependency>
配置文件application.yml
spring:
application:
name: elk-template
profiles:
active: dev
log-config:
# 日志级别
level: INFO
# 控制台日志是否开启
stdout: true
logstash:
# 是否启用logstash记录日志
enable: true
# logstash 地址
destination: 192.168.56.105:5044
日志配置文件logback-spring.xml配置示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProperty scope="context" name="server_name" source="spring.application.name"/>
<springProperty scope="context" name="env" source="spring.profiles.active"/>
<springProperty scope="context" name="logLevel" source="log-config.level" defaultValue="INFO"/>
<springProperty scope="context" name="stdoutOpen" source="log-config.stdout" defaultValue="true"/>
<springProperty scope="context" name="useLogStash" source="log-config.logstash.enable" defaultValue="false"/>
<springProperty scope="context" name="logStashDestination" source="log-config.logstash.destination" defaultValue=""/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}.%M.%L) - %highlight(%msg) %n</pattern>
</layout>
</appender>
<if condition='property("useLogStash").equals("true")'>
<then>
<!--log stash 输出-->
<appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>${logStashDestination}</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<!-- 打印行号、方法名,官方不建议在生产环境开启此配置,默认为false(关闭),具网友测试开启后的耗时是未开启的大约360倍的时间(业务量小的时候可以忽略) -->
<!-- <includeCallerData>true</includeCallerData> -->
<!-- 设置时区-->
<timeZone>UTC</timeZone>
<!-- 日期格式化-->
<!-- <timestampPattern>yyyy-MM-dd'T'HH:mm:ss.SSS</timestampPattern>-->
<!-- 添加自定义属性,这里的server_name是服务名-->
<!-- <customFields>{"server_name":"demo-server"}</customFields> -->
</encoder>
<queueSize>16384</queueSize>
<!-- 设置超时时间, 默认没有,使用集群的时候可以加上-->
<!--<writeTimeout>30 seconds</writeTimeout>-->
</appender>
<root level='${logLevel}'>
<if condition='property("stdoutOpen").equals("true")'>
<then>
<appender-ref ref="STDOUT"/>
</then>
</if>
<appender-ref ref="STASH"/>
</root>
</then>
<else>
<root level='${logLevel}'>
<if condition='property("stdoutOpen").equals("true")'>
<then>
<appender-ref ref="STDOUT"/>
</then>
</if>
</root>
</else>
</if>
</configuration>
项目中日志打印还是和平时使用的一样即可。更详细的配置说明见官方文档: https://github.com/logstash/logstash-logback-encoder