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"]
相关推荐
武子康4 天前
调查研究-197 FAISS vs Elasticsearch 全面对比:从向量检索、全文搜索到 RAG 选型指南
人工智能·elasticsearch·agent
Elasticsearch5 天前
Elasticsearch ES|QL:现已支持视图、子查询和读取时模式定义
elasticsearch
Elasticsearch8 天前
Kibana 中的 SNMP 拓扑数据:从采集到 Canvas
elasticsearch
Elasticsearch10 天前
3个信号、2个环境变量、0个采集器:使用 Python 和 Elastic 的托管 OTLP 端点实现 OpenTelemetry
elasticsearch
Elasticsearch12 天前
如何通过 Claude Code 来写入 CSV 数据到 Elasticsearch
elasticsearch
大志哥12313 天前
ES和Logstash日志链路系统上线后遭遇切片爆炸(解决)
大数据·elasticsearch
TableRow14 天前
参数化搜索的实现原理:从多维索引到查询优化
elasticsearch·全文检索
醉颜凉14 天前
Elasticsearch高性能优化:Bulk API大规模数据导入性能调优全攻略
elasticsearch·性能优化·jenkins
Ysouy14 天前
Spring Data Elasticsearch 全流程学习教程
java·spring·elasticsearch