如何配置 rsyslog 来处理 MySQL 慢查询日志多行消息?

Gai*_*aia 3 mysql rsyslog mysql5.5

使用 rsyslog v8.2.2,我想对多行消息进行分组,例如 MySQL 慢查询日志输出的消息。

每条新消息都以三个连续的行开始,以“#”作为该行的第一个字符,尽管有些消息只有两行在消息的开头带有“#”。(我怀疑是由 PHP cli 触发的查询,而不是标准 PHP,不带有 # Time:标记)。例子:

# Time: 140817  0:59:22
# User@Host: root[root] @ localhost []
# Query_time: 5.864315  Lock_time: 0.000033 Rows_sent: 857715  Rows_examined: 857715
SET timestamp=1408237162;
SELECT /*!40001 SQL_NO_CACHE */ * FROM `sales_flat_quote_shipping_rate`;
# Time: 140817  1:00:06
# User@Host: user2[user2] @ localhost []
# Query_time: 4.070595  Lock_time: 0.000068 Rows_sent: 0  Rows_examined: 1536
use db2;
SET timestamp=1408237206;
DELETE FROM `catalog_product_index_price_idx`;
# User@Host: db3[db3] @ localhost []
# Query_time: 3.892674  Lock_time: 0.046493 Rows_sent: 0  Rows_examined: 659
use db3;
SET timestamp=1408237206;
UPDATE user SET cert = 'yes' WHERE site_id < 10;
# Time: 140817  1:00:06
# User@Host: user2[user2] @ localhost []
# Query_time: 4.070595  Lock_time: 0.000068 Rows_sent: 0  Rows_examined: 1536
use db2;
SET timestamp=1408237206;
DELETE FROM `catalog_product_index_price_idx`;
# User@Host: db3[db3] @ localhost []
# Query_time: 3.892674  Lock_time: 0.046493 Rows_sent: 0  Rows_examined: 659
use db3;
SET timestamp=1408237206;
UPDATE user SET cert = 'yes' WHERE site_id < 10;
Run Code Online (Sandbox Code Playgroud)

如何配置 rsyslog 以将它们作为单个消息发送?

gre*_*ius 5

Rsyslog 可以通过imfile模块将多行日志消息分组为一条消息,但仅支持以下三种读取模式:

  • 基于行(默认)- 每行都是一条新消息。
  • 段落 - 日志消息之间有一个空行。
  • 缩进 - 新的日志消息从一行的开头开始。如果一行以空格开头,则它是它之前的日志消息的一部分。

您的情况与其中任何一个都不匹配,因此您无法直接通过 rsyslog 进行分组。但是,您可以解析日志文件并将它们转换为 rsyslog 能够理解的格式。简单的 shell 脚本可以完成这项工作,或者您可以查看功能齐全的日志管理工具,例如logstash