目录
- 一、背景
- 二、安装
- 三、启用kafka模块
- 四、修改配置
- 四、启用脚本
- 五、格式化springBoot日志格式
- 七、替换@timestamp为日志时间
- 六、遇到的问题
- 六、参考
一、背景
需要将微服务日志传输到elk系统,需要先将日志传到kafka做缓冲;
filebeat-7.9.2.tar下载
百度云盘链接:戳我
提取码:iefm
二、安装
1 | tar -zxvf filebeat-7.9.2-linux-x86_64.tar.gz |
三、启用kafka模块
进入modules.d文件夹,修改kafka.yml.disabled成kafka.yml
1 2 | cd modules.d/ mv kafka.yml.disabled kafka.yml |
四、修改配置
编辑配置文件filebeat.yml,主要修改以下配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 配置需要监控读取的文件,可多个 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 |
四、启用脚本
附上我用的重启脚本,路径自行修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # !/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,如下:
1 2 3 4 5 6 7 8 9 10 | {<!-- --> "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官方说明
1 2 3 4 5 | <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>5.3</version> </dependency> |
- 配置logback日志appender的encoder
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <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的配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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
1 | 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