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"]
相关推荐
Elasticsearch9 小时前
从 22.61GB 到 15.63GB:Elasticsearch 9.5 如何用「混合存储」重新定义日志数据库
elasticsearch
Elasticsearch9 小时前
用于自托管 LLM 调优的 vLLM Prometheus 指标:TTFT、KV Cache 和 GPU 利用率
elasticsearch
Sayai14 小时前
Elasticsearch 快照备份到 NAS(NFS)实战:SLM 自动化 + 365 天保留策略
elasticsearch·自动化·jenkins
JavaPub-rodert1 天前
写软著 - Copyright Forge Skill 完整闭环改造方案
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客1 天前
从建议到修复的 4 个阶段:使用 Elastic Workflows 实现人在回路中的自动化
运维·数据库·人工智能·后端·elasticsearch·ai·自动化
Elasticsearch2 天前
使用 OpenTelemetry 进行 Android 应用监控:从点击到后端的分布式追踪
elasticsearch
Elasticsearch2 天前
安心睡过凌晨 3 点的告警:在 Red Hat OpenShift 上使用 Elastic 实现自动化故障事件响应
elasticsearch
Elasticsearch2 天前
将 1,100 个文件迁移到 Redux Toolkit v2,同时避免冻结 Kibana 单体仓库
elasticsearch
Elasticsearch2 天前
从 582 毫秒的延迟峰值追踪到负责该服务的团队:使用 Kibana Discover
elasticsearch
Jinkxs2 天前
SkyWalking - 生产级部署:集成 Elasticsearch 作为后端存储
大数据·elasticsearch·skywalking