filebeat使用dissect替换默认的的timestamp以及多行处理

大家在使用elasticsearch查询日志的时候应该都碰到过日志乱序的问题,因为elasticsearch默认使用写入ES的时间作为timestamp,这样多个文件往ES里面写的时候难免会有乱序的情况。

解决办法就是将日志里面的时间抽取出来作为日志的默认时间戳。下面就来讲讲具体怎么实现:

  1. 使用dissect提取日志里面的日期和时间

    yaml 复制代码
    - dissect:
        #这里按照日志的格式提取就好,不一定非要像我这样
        tokenizer: "%{log_date} %{log_time} %{message}"
        field: "message"
        target_prefix: "extracted"
  2. 使用script生成新的timestamp,并处理异常情况

    yaml 复制代码
    - script:
        language: javascript
        source: >
          function process(event) {
          	try{
          		var date = event.Get("extracted:log_date");
          		var time = event.Get("extracted:log_time");
          		if(date && time){
          			var timestamp = new Date(date + 'T' + time + 'Z');
          			if(isNaN(timestamp.getTime())){
          				return;
          			}
          			event.Put("@timestamp", timestamp);
          		}
          	}
          	catch(e){
          		event.Put("error", e.message);
          	}
          }
  3. 最后使用timestamp替换原有时间戳

    yaml 复制代码
    - timestamp:
        filed: "@timestamp"
        layouts: ["ISO8601"]

完整配置:

yaml 复制代码
# filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  path: 
    - /data/app/folder1/logs/aa.log
    - /data/app/folder2/logs/bb.log
    - /data/app/folder3/logs/cc.log
    - /data/app/folder4/logs/dd.log
    - /data/app/folder5/logs/ee.log
  
  # 多行处理(适用于将多行异常转为一条日志记录)
  multiline:
    pattern: '^\d{4}-\d{2}-\d{2}'
    negate: true
    match: after

  processors:
  - dissect:
	    tokenizer: "%{log_date} %{log_time} %{message}"
	    field: "message"
	    target_prefix: "extracted"
  - script:
      language: javascript
      source: >
        function process(event) {
         	try{
         		var date = event.Get("extracted:log_date");
         		var time = event.Get("extracted:log_time");
         		if(date && time){
         			var timestamp = new Date(date + 'T' + time + 'Z');
         			if(isNaN(timestamp.getTime())){
         				return;
         			}
         			event.Put("@timestamp", timestamp);
         		}
         	}
         	catch(e){
         		event.Put("error", e.message);
         	}
         }
  - timestamp:
	    filed: "@timestamp"
	    layouts: ["ISO8601"]
相关推荐
W如Q扬2 小时前
filebeat日志时区问题处理
elasticsearch·efk·filebeat
武子康3 小时前
大数据-176 Elasticsearch Filter DSL 全面实战:过滤查询、排序分页、高亮与批量操作
大数据·后端·elasticsearch
想个名字太难4 小时前
ElasticSearch编程操作
java·elasticsearch·全文检索
ganshenml15 小时前
【GIT】Git 本地无法识别远程分支的原因与解决方法 not a valid ref
大数据·git·elasticsearch
The Straggling Crow21 小时前
熟练版本控制 (Git)、CI/CD 流程。
git·elasticsearch·ci/cd
失伟1 天前
CDC(数据变更捕获)场景应用
mongodb·elasticsearch·kafka·kafka-connect
Elasticsearch1 天前
使用 LangGraph . js 和 Elasticsearch 构建一个金融 AI 搜索工作流
elasticsearch
武子康1 天前
大数据-175 Elasticsearch Term 精确查询与 Bool 组合实战:range/regexp/fuzzy 全示例
大数据·后端·elasticsearch
悟悟悟!1 天前
git使用笔记:git日常工作流和命名规范
笔记·git·elasticsearch