使用fileBeat7.9.2读取日志文件到KAFKA

目录

  • 一、背景
  • 二、安装
  • 三、启用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

  1. 引入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>
  1. 配置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'

六、遇到的问题

  1. 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
  1. 配置了替换时间戳却无效
    原因:查看日志时间格式是不是 yyyy-MM-dd HH:mm:ss.SSS,特别注意后面的 .SSS,如果是 :SSS可能会无效

六、参考

参考文章:
1. https://blog.csdn.net/qq_27818541/article/details/108063235