基于 ELK6.6 + Filebeat 的 Spring Cloud 日志收集

*重要:请始终保证 ELK 各组件及 Filebeat 版本一致,以避免意想不到的麻烦。*

ELK

官网:[https://www.elastic.co/](https://www.elastic.co/cn/).

ELK 即 Elasticsearch、Logstash、Kibana,其中:

  • Elasticsearch:一个基于Lucene的搜索服务器,无人不知,不多介绍

  • Logstash:Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的 “存储库” 中。

  • Kibana:Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作。

安装

ELK 各组件官网均有详细的安装文档,对于小规模的场景,推荐使用 docker 打包安装,方便快捷易维护。

docker 如何使用请自行解决,下面给一个 docker 运行 elk 的示例代码:
docker run -dti \
-p 5601:5601 \
-p 9200:9200 \
-p 9300:9300 \
-p 5044:5044 \
-e TZ="Asia/Shanghai" \
--name elk660 sebp/elk:660

配置

Elasticsearch 和 Kibana 采用默认配置即可,Logstash 需要简单的配置以适应 Spring Cloud 下的日志。

配置文件目录为:/etc/logstash/conf.d/,不同环境下可能有差异。

日志是通过 Filebeat 搬运的,首先需要配置日志的输入。

vi /etc/logstash/conf.d/02-beats-input.conf

编辑文件保证内容类似:

input {
beats {
port => 5044
codec => "json"
}
}
* 1、input 表示日志输入
* 2、beats 即用于接收 filebeat 日志的插件
* 3、codec 为指定输入的日志格式,此处为 json

配置好输入后,在配置日志的输出(到Elasticsearch):

vi /etc/logstash/conf.d/30-output.conf

编辑文件保证内容类似:

output {
elasticsearch {
hosts => ["localhost"]
manage_template => false
index => "%{[fields][index]}-%{+YYYY}"
document_type => "%{[fields][doc]}"
}
}
* 1、index 即索引,使用了自定义字段+当前年份生成
* 2、document_type 即文档类型,也通过自定义字段指定
* 3、自定义字段会通过 Filebeat 传入,后面会看到
* 4、对 Elasticsearch 相关概念不了解的,可以自行了解一下

现在就可以启动 elk 了,启动后可以访问 Kibana,但是除了一个属于系统的索引,并没有自定义的索引存在。

Kibana配置认证

最简单的方式是通过 Nginx 反向代理,然后在 Nginx 上配置基础认证。

可参考:https://www.cnblogs.com/configure/p/7607302.html

Filebeat

Filebeat 是一个轻量级的日志搬运工具,官网也有详细的教程。

安装

安装有不同平台下的详细安装教程:https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-installation.html

Centos 7 安装脚本示例:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.6.1-x86_64.rpm \
&& sudo rpm -vi filebeat-6.6.1-x86_64.rpm

配置

安装完成后开始配置:

vi /etc/filebeat/filebeat.yml

打开日志:

filebeat.inputs:
- type: log
enabled: true
paths:
- /home/logs/*.json
fields:
index: logtest
doc: springcloud
1、enabled 设置是否开启该 type 的日志收集
2、paths 是一个数组,用于指定日志的目录和匹配规则
3、fields 用来指定自定义添加的字段(刚刚 Logstash 中用来生成索引和文档类型的字段就是这里定义的)

输出到 Logstash:

output.logstash:
hosts: ["localhost:5044"]
localhost 请填 Logstash 实际的地址信息
同时可以注释掉 "utput.elasticsearch" ,因为我们不需要它

现在可以启动filebeat了:

systemctl start filebeat

查看服务状态:

systemctl status filebeat

设置开机启动:

systemctl enable filebeat

Logback配置

日志输出到文件的部分,需要转换为 Json 格式

依赖

Gradle:

// https://mvnrepository.com/artifact/net.logstash.logback/logstash-logback-encoder
compile group: 'net.logstash.logback', name: 'logstash-logback-encoder', version: '5.3'

Maven:

<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.3</version>
</dependency>
因为是 Spring Boot 项目,logback的基础依赖已经包含了,所以不再需要引入

配置文件

logback 如何配置请自行了解。

对于控制台的输入,格式基本保持不变,仅修改输出到文件的格式。

完整的配置文件如下(logback-spring.xml):

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="1 seconds">
 
<contextName>logback</contextName>
 
<property name="app.name" value="service-myProject"/>
<appender name="stdout_info" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n</pattern>
</encoder>
</appender>
<appender name="stdout_warn" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>%yellow(%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n)</pattern>
</encoder>
</appender>
<appender name="stdout_error" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>%red(%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n)</pattern>
</encoder>
</appender>
 
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/home/logs/${app.name}.json</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/home/logs/${app.name}.%d{yyyy-MM-dd.HH}.json.gz
</fileNamePattern>
<maxHistory>365</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>100MB</maxFileSize>
</triggeringPolicy>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"app":"${app.name}"}}</customFields>
</encoder>
</appender>
 
<root level="INFO">
<appender-ref ref="stdout_info"/>
<appender-ref ref="stdout_warn"/>
<appender-ref ref="stdout_error"/>
<appender-ref ref="file"/>
</root>
 
<logger name="com.example.logback" level="error"/>
 
<logger name="stdout_log" level="info" additivity="false">
<appender-ref ref="stdout_info"/>
<appender-ref ref="stdout_warn"/>
<appender-ref ref="stdout_error"/>
</logger>
 
</configuration>
1、 指定了服务名称:property name="app.name",方便后续的日志筛选
2、 appender name="file" 部分的配置即输出到文件的配置
3、 customFields 为自定义字段。
4、 其他配置慢慢看一下应该都能看懂

当服务启动后就能看到 /home/logs 下的日志文件,通过在 Elasticsearch 中也能看到其索引信息,打开 Kibana 可以添加对应的索引到面板中,Kibana 的查询功能很强大,可以多摸索摸索。