版权声明:http://blog.csdn.net/anxpp https://blog.csdn.net/anxpp/article/details/87879206
基于 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 的查询功能很强大,可以多摸索摸索。