Filebeat 将 mysql-slow.log 中的几行合并为一行

Filebeat merge several lines from mysql-slow.log into one line

我正在尝试使用 Filebeat Logstash 和 Elasticsearch 分析 mysql-slow.log。我在 mysql-slow.log 文件中有这样的消息:

# Time: 2019-11-08T20:02:05.474508Z
# User@Host: user[user] @ localhost []  Id:     2
# Query_time: 0.000716  Lock_time: 0.000223 Rows_sent: 2  Rows_examined: 2
SET timestamp=1573243325;
select * from Persons;

首先,我尝试让 Filebeat 将 5 行日志消息发送到 elasticsearch,但所有消息都在一行中。

我在 filebeat.yml

中设置了多行输入
multiline.pattern = `^\#`
multiline.negate = true
multiline.match = after

不幸的是它不起作用,elasticsearch 单独接收行

  1. 消息 --> # 时间:2019-11-08T20:02:05.474508Z
  2. 消息 --> # User@Host: user[user] @localhost[] Id: 2 等等...

我想以下列格式在一封邮件中接收它:

# Time: 2019-11-08T20:02:05.474508Z # User@Host: user[user] @ localhost []  Id:     2 # Query_time: 0.000716  Lock_time: 0.000223 Rows_sent: 2  Rows_examined: 2 SET timestamp=1573243325; select * from Persons;

您的多行模式是错误的,它会匹配任何以 # 开头的行,因此您示例中的前三行中的每一行都是 filebeat/logstash.[=15 的事件=]

您需要更改多行模式以仅匹配事件的第一行,即以 # Time 开头的行。

以下 filebeat 配置适用于我的测试。

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /opt/data/Whosebug/*.log
  multiline.pattern: '^\#[[:space:]]Time'
  multiline.negate: true
  multiline.match: after

output.logstash:
  hosts: ["elk:5044"]

logstash pipeline simples监听5044输出到elasticsearch,然后结果如下

如您所见,所有文件行在 elasticsearch 上都被索引为单个事件。