一、背景
需要将微服务日志传输到elk系统,需要先将日志传到kafka做缓冲;
filebeat-7.9.2.tar下载
百度云盘链接:戳我
提取码:iefm
二、安装
tar -zxvf filebeat-7.9.2-linux-x86_64.tar.gz
三、启用kafka模块
进入modules.d文件夹,修改kafka.yml.disabled成kafka.yml
cd modules.d/
mv kafka.yml.disabled kafka.yml
四、修改配置
编辑配置文件filebeat.yml,主要修改以下配置
# 配置需要监控读取的文件,可多个
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/ms*-json*.log
- /var/myLog/*.log
# 注释掉output.elasticsearch
# ---------------------------- Elasticsearch Output ----------------------------
#output.elasticsearch:
# hosts: ["localhost:9200"]
# 配置输出到kafka
output.kafka:
enabled: true
hosts: ["192.168.1.142:9092"]
topic: 'cbos-log'
# 配置输出到控制台(调试用)
#output.console:
# pretty: true
四、启用脚本
附上我用的重启脚本,路径自行修改
# !/bin/bash
# -author:nongzy
# -create time : 2020-10-14 18:00
#kafka_2.13-2.6.0/zookeeper-server-start.sh -daemon config/zookeeper.properties
name=filebeat
pid=$(ps -ef|grep "${name}" |grep -v 'grep' |awk '{print $2}')
if [ -n "${pid}" ];
then
kill -9 ${pid}
echo -e "已停止应用: ${pid}"
fi
nohup /usr/local/elk_7.9.2/filebeat/filebeat-7.9.2-linux-x86_64/filebeat -e -c /usr/local/elk_7.9.2/filebeat/filebeat-7.9.2-linux-x86_64/filebeat.yml -d "publish" >filebeat.log 2>&1 &
echo "已启动${name}"
五、格式化springBoot日志格式
到第四步没有问题的话已经能够把日志推送到kafka队列了,但是我要把springBoot输出的日志格式化成json,如下:
{
"applicationName": "producer-server",
"indexName": "producer-server-2020-11-09",
"logTime": "2020-11-09 17:51:08.147",
"logger": "ty.cbos.ms.user.generic.interceptor.FeignAuthRequestInterceptor",
"level": "INFO",
"thread": "http-nio-8240-exec-9",
"message": "消息消息消息消息",
"traceId": "44eb90041c04e7de"
}
所以我们需要更改logback的输出编码,let’s go
- 引入logstash-logback-encoder
戳我看git官方说明
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.3</version>
</dependency>
- 配置logback日志appender的encoder
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<pattern>
<pattern>
{
"applicationName":"producer-server",
"indexName":"producer-server-%d{yyyy-MM-dd}",
"logTime": "%d{yyyy-MM-dd HH:mm:ss.SSS}",
"logger": "%logger",
"level": "%level",
"thread": "%thread",
"message": "%message",
"traceId": "%X{X-B3-TraceId:-}"
}
</pattern>
</pattern>
</providers>
</encoder>
六、替换@timestamp为日志时间
默认情况下filebeat传到kafka的timestamp是发送的时间,需要替换成日志里面的时间,以方便在kibana中查询。同样需要修改filebeat的配置文件:
processors:
# 去掉filebeat的属性,看自己需求
- drop_fields:
fields: ["agent","ecs","host","log", "fields","input"]
# filebeat读取的每条日志都放在message里面做为一个json字符串,这里提取message里面的logTime出来,单独设置一个属性,用来替换下面的时间戳
- script:
lang: javascript
id: add_logTime
tag: enable
source: >
function process(event) {
var message= event.Get("message");
var obj =JSON.parse(message);
var logTime = obj.logTime;
event.Put("start_time",logTime);
event.Put("fromHost","192.168.1.142");
}
# 替换时间戳,
- timestamp:
# 格式化时间值 给 时间戳
field: start_time
# 使用我国东八区时间 格式化log时间
timezone: Asia/Shanghai
layouts:
- '2006-01-02 15:04:05'
- '2006-01-02 15:04:05:999'
test:
- '2019-06-22 16:33:51'
七、遇到的问题
- filebeat一直提示 [publisher] pipeline/retry.go:219 retryer: send unwait signal to consumer
原因:可能是无法连接到kafka,需要修改kafka的server.properties,ip为kafka所在的机器内网ip
advertised.listeners=PLAINTEXT://192.168.1.142:9092
- 配置了替换时间戳却无效
原因:查看日志时间格式是不是 yyyy-MM-dd HH:mm:ss.SSS,特别注意后面的 .SSS,如果是 :SSS可能会无效
八、参考
参考文章:
1. https://blog.csdn.net/qq_27818541/article/details/108063235