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"]
相关推荐
阿里云大数据AI技术11 小时前
阿里云荣获 2025–2026 年度 Elastic中国最佳合作伙伴奖
人工智能·elasticsearch
vpk11213 小时前
【无标题】
运维·elasticsearch·docker
綮地14 小时前
ES备份脚本
大数据·elasticsearch·搜索引擎
三水不滴15 小时前
Elasticsearch 实战系列(二):SpringBoot 集成 Elasticsearch,从 0 到 1 实现商品搜索系统
经验分享·spring boot·笔记·后端·elasticsearch·搜索引擎
奋斗者1号18 小时前
解决Git Push Gerrit分支失败的全流程实战
大数据·git·elasticsearch
margu_16818 小时前
【Elasticsearch】es7.2 跨集群迁移大量数据
elasticsearch
常利兵18 小时前
Spring Boot 邂逅Elasticsearch:打造搜索“光速引擎”
spring boot·elasticsearch·jenkins
Jiozg18 小时前
ES安装到linux(ubuntu)
linux·ubuntu·elasticsearch
JP-Destiny18 小时前
后端-elasticsearch
大数据·elasticsearch·搜索引擎
等风来不如迎风去18 小时前
【linux】tar [选项] 归档文件名 要打包的文件/目录..
linux·运维·elasticsearch