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

一、背景

需要将微服务日志传输到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

  1. 引入logstash-logback-encoder
    戳我看git官方说明
  <dependency>
      <groupId>net.logstash.logback</groupId>
      <artifactId>logstash-logback-encoder</artifactId>
      <version>5.3</version>
  </dependency>
  1. 配置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'

七、遇到的问题

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

八、参考

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值