Rsyslog

如何配置 rsyslog 來處理 MySQL 慢查詢日誌多行消息?

  • August 17, 2014

使用 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;

如何配置 rsyslog 以將它們作為單個消息發送?

*rsyslog 可以通過imfile*模組將多行日誌消息組合成一條消息,但是僅支持以下三種讀取模式:

  • 基於行(預設)- 每行都是一條新消息。
  • 段落 - 日誌消息之間有一個空行。
  • 縮進 - 新的日誌消息從行首開始。如果一行以空格開頭,則它是它之前的日誌消息的一部分。

您的案例與其中任何一個都不匹配,因此您不能直接通過 rsyslog 進行分組。但是,您可以解析日誌文件並將它們轉換為 rsyslog 能夠理解的格式。簡單的 shell 腳本可以完成這項工作,或者您可以查看功能齊全的日誌管理工具,例如logstash

引用自:https://serverfault.com/questions/622035