接入ELK - filebeat-sleuth方式
接入ELK - filebeat-sleuth方式
为方便日志查找,需要统一日志打印格式。
目前有两种方案,主要在于收集日志方式的区别
方式一:采用 Logback 直接推送数据至 Logstash 存入 ES
方式二:采用 FileBeat 读取日志文件,由 Logstash 解析后存入 ES
此处介绍方式二 采用 FileBeat 读取日志文件 的改造方法,大致分为以下几步:
修改pom,引入依赖(可选)
修改日志配置文件,替换logback日志配置
服务器部署 FileBeat 修改配置文件并启动
进入 Kibana 配置索引模式
1、引入依赖(可选)
引入 sleuth 依赖的目的是为了生成链路追踪ID,Kibana中可根据此ID跨多个应用搜索一次请求的所有日志,如不引入则不生成链路追踪ID,即无法跨应用查询日志。
情况一
如项目中引用了 spring-cloud-dependencies 直接添加以下依赖即可
<!-- 链路追踪 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
情况二
如项目中未使用 spring-cloud-dependencies
需确定项目所用 springboot 版本对应的 sleuth 版本 (查看版本对应关系),然后引入依赖
<!-- 链路追踪 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
<version>版本号</version>
</dependency>
sleuth 常见问题处理:
问题一
问题描述:引入此依赖后,项目启动一半卡住无法继续启动
问题原因:是由于 sleuth 和 redis 线程冲突造成阻塞
解决方法:在项目配置文件中添加如下配置即可
spring:
sleuth:
redis:
enabled: false
2、修改日志配置文件
将项目中的 logback-spring.xml 修改为如下内容
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<springProperty scope="context" name="spring.application.name" source="spring.application.name"/>
<springProperty scope="context" name="logging.file.max-history" source="logging.file.max-history"/>
<springProperty scope="context" name="logging.level.root" source="logging.level.root"/>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 定义日志的根目录 -->
<property name="LOG_HOME" value="./logs/${spring.application.name}"/>
<!-- CONSOLE -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){blue} | %clr(%5p){highlight} | %clr(${HOSTNAME:-HOSTNAME}){red} | %clr(%X{X-B3-TraceId}){green} | %clr(%X{X-B3-SpanId}){green} | %clr(${PID:- }){magenta} | %clr(%15.15t){yellow} | %clr(%-40.40logger{39}){cyan} %clr(|){highlight} %msg%n%wEx</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="ASYNC_CONSOLE" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="CONSOLE"/>
</appender>
<!-- FILE -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${LOG_HOME}/${spring.application.name}.log</file>
<!--<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${logging.level.root:-INFO}</level>
</filter>-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/%d{yyyy-MM}/${HOSTNAME:-HOSTNAME}.log.%d{yyyy-MM}.%i.gz</FileNamePattern>
<MaxHistory>${logging.file.max-history:-1826}</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${logging.file.max-size:-100MB}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<Pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} | %5p | ${HOSTNAME:-HOSTNAME} | %X{X-B3-TraceId} | %X{X-B3-SpanId} | ${PID:- } | %15.15t | %-40.40logger{39} | %msg%n%wEx </Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE"/>
</appender>
<root>
<level value="${logging.level.root:-INFO}"/>
<springProfile name="dev,test">
<appender-ref ref="ASYNC_CONSOLE"/>
</springProfile>
<appender-ref ref="ASYNC_FILE"/>
</root>
</configuration>
一些说明
spring.application.name 为当前应用的名称
logging.file.max-history 日志最长保留时间,如不配置默认为5年
logging.level.root 日志级别,如不配置默认为 INFO
注意事项
sleuth 新旧版本之间获取 traceId 和 spanId 值的方式有差异,请注意修改 logback-spring.xml 日志配置中对应的取值表达式。
旧版本是:%X{X-B3-TraceId} | %X{X-B3-SpanId}
新版本是:%X{traceId} | %X{spanId}
详细请参考 sleuth 具体的实现类:org.springframework.cloud.sleuth.autoconfig.TraceEnvironmentPostProcessor
2.x 版本
3.x 版本
3、部署FileBeat
在项目所在服务器部署 FileBeat 部署步骤:
复制FileBeat至应用服务器,文件在共享NAS盘,路径:/home/app/data/tool/filebeat-7.14.0-linux-x86_64.tar
在解压目录内创建配置文件 filebeat-logstash.yaml 并修改配置内容
进入安装目录,启动FileBeat
配置文件内容:
filebeat.inputs:
- type: log
enabled: true
paths:
#日志文件的详细地址,多个文件支持通配符
- /home/app/service/assist/logs/assist/assist*.log
#合并多行日志
multiline:
#定义行开头的正则
pattern: '^[\d]{4}-[\d]{2}-[\d]{2}'
#不匹配正则的合并到上一行
negate: true
#合并到上一行的末尾
match: after
fields:
#项目名称
application: assist
#服务器的IP地址
hostip: IP地址
fields_under_root: true
setup.template.settings:
index.number_of_shards: 1
output.logstash:
hosts: ["IP:PORT"]
需修改内容:
修改 paths 项,改成日志文件的地址改成项目日志文件的路径
修改 application 项,改成应用名称修改为项目的名称,请和项目中 spring.application.name 保持一致
修改 hostip 项,改成应用所在服务器的IP地址
FileBeat 启动脚本:
nohup ./filebeat -e -c filebeat-logstash.yaml > /dev/null 2>&1 &
fileBeat 常见问题处理:
问题一
问题描述:如启动后发现 Kibana 中找不到项目对应的索引
问题原因:filebeat-logstash.yaml 中日志路径配置错误
处理方法:重新启动 FileBeat 查看日志寻找错误原因。解决完错误后,建议将 FileBeat 使用上一条命令重新启动,避免输出不必要的日志占用磁盘空间。
输出 FileBeat 日志
#将日志输出到 filebeat-log.log
nohup ./filebeat -e -c filebeat-logstash.yaml > filebeat-log.log 2>&1 &
问题二
问题描述:启动 FileBeat 时报 can only be writable by the owner but the permissions are xxx
问题原因:filebeat-logstash.yaml 文件权限不正确
处理方法:将 FileBeat 的配置文件 filebeat-logstash.yaml 权限修改为 755
修改权限命令:
chmod 755 filebeat-logstash.yaml
4、配置Kibana
修改完成后,进入 kibana 查看项目对应索引是否已创建,确认创建成功后添加索引模式
详细步骤请查看 Kibana创建索引模式