【问题标题】:Merge logs between date/time using filebeat使用 filebeat 合并日期/时间之间的日志
【发布时间】:2025-12-26 23:15:16
【问题描述】:

我正在尝试使用 fileBeat(无 Logstash)将日志推送到 elasticSearch

我想发送以下登录单条消息,但它被分成多条消息,每一行变成单独的消息

20161014 17:49:09.169 [ERROR] [Thread-2974] some.java.class.:70 - some.java.Exception: write failed. History: [requestHost=123-some.org.com, time=Fri Oct 14 17:49:05 GMT-07:00 2016, exception=java.net.SocketTimeoutException]
[requestHost=123-some.org.com, time=Fri Oct 14 17:49:07 GMT-07:00 2016, exception=java.net.SocketTimeoutException]
[requestHost=123-some.org.com, time=Fri Oct 14 17:49:09 GMT-07:00 2016, exception=java.net.SocketTimeoutException]
 Tried 3 times
        at java.lang.Thread.run(Thread.java:745)
20161014 17:49:09.169 [ERROR] [Thread-3022]

我想合并两个日期之间的所有行(第一行和最后一行)

这是我的filebeat.ymlsn-p

 paths:
      - /test.log
      multiline.pattern: '^\[0-9]{8}'
      multiline.negate: true
      multiline.match: after

我需要知道正确的regex

我正在尝试不使用logstash来解决这个问题

【问题讨论】:

  • 通过转义左括号,您将删除它的权力并匹配文字括号。
  • 我在 go playground 上尝试了一些正则表达式(来自 filebeat 文档),它们是有效的,但实际上它们都给了我同样的问题,我不是正则表达式忍者,但看起来我需要花一些时间并解决这个问题,或者只使用带有 GROK 过滤器的 logstash
  • 这个问题中提供的虚线配置对我有用。 Filebeat 版本 - 6.8.14

标签: elasticsearch logstash logstash-grok filebeat


【解决方案1】:

将以下 Filebeat 配置与提供的日志示例一起使用会产生两个事件,其中每条消息都以日期开头。

我使用下面的配置运行./filebeat -c filebeat.yml -e -v -d "*" 进行测试。我还在Go playground 上测试了该模式。

filebeat.yml:

filebeat:
  prospectors:
    - paths: ["input.txt"]
      multiline:
        pattern: '^[0-9]{8}'
        negate:  true
        match:   after
output:
  console:
    pretty: false

输出:

{   
  "@timestamp": "2016-10-17T14:13:31.292Z",
  "beat": {
    "hostname": "host.example.com",
    "name": "host.example.com",
  },  
  "input_type": "log",
  "message": "20161014 17:49:09.169 [ERROR] [Thread-2974] some.java.class.:70 - some.java.Exception: write failed. History: [requestHost=123-some.org.com, time=Fri Oct 14 17:49:05 GMT-07:00 2016, exception=java.net.SocketTimeoutException]\n[requestHost=123-some.org.com, time=Fri Oct 14 17:49:07 GMT-07:00 2016, exception=java.net.SocketTimeoutException]\n[requestHost=123-some.org.com, time=Fri Oct 14 17:49:09 GMT-07:00 2016, exception=java.net.SocketTimeoutException]\n Tried 3 times\n        at java.lang.Thread.run(Thread.java:745)",
  "offset": 519,
  "source": "input.txt",
  "type": "log"
}   
{   
  "@timestamp": "2016-10-17T14:17:21.686Z",
  "beat": {
    "hostname": "host.example.com",
    "name": "host.example.com",
  },  
  "input_type": "log",
  "message": "20161014 17:49:09.169 [ERROR] [Thread-3022]",
  "offset": 563,
  "source": "input.txt",
  "type": "log"
} 

【讨论】:

  • 我没有看到 "\n" 并且消息仍然被分解成碎片,这些是 log4j 日志,您认为这有什么不同吗?
  • 你运行的是什么版本的 Filebeat?什么操作系统?我在 OS X 上的 5.0-rc1 上试过这个,效果很好。我认为它们是 log4j 日志这一事实没有任何区别。
  • 我在 ubuntu 14.04.03 上使用 filebeat version 1.3.1 (amd64)。如果我能找到/编写一个以^[0-9]{8} 开头并在下一次出现相同^[0-9]{8} 时结束的正则表达式,你认为这可以解决我的问题吗?
  • 我测试了我在 1.3.1 上提供的配置,它适用于您提供的日志示例。顺便说一句,您在问题中发布的配置对 1.3.1 无效,因为缩进错误并且您不能使用像 multiline.pattern 这样的虚线键。请尝试我的答案中给出的确切配置和命令。如果它们不起作用,那么您能否提供更大的日志示例,其中包含如何将行分组为事件的示例。
  • 非常感谢您坚持不懈地尝试解决我的问题,摆脱虚线键后一切都到位