簡體   English   中英

如何將消息記錄到通用(更改)文件中

[英]How can I log messages to generic (changing) files

這個問題類似於Server Fault 上未回答的rsyslog 特定問題 我不清楚最好的解決方案是通過已經存在的軟件(如 rsyslog 或 logstash)還是我必須自己構建一些東西。 這就是我在這里問的原因。

問題

我有幾個並行運行的 python 進程(不是由多處理處理的)。 他們構建需要寫入該組的相同日志文件的組。 從多個進程記錄到同一個文件必須經過某種序列化以避免文件損壞,因此想到了 rsyslog 或 logstash。

我沒有設法發現(無論是 rsyslog 還是 logstash)是如何過濾包含我事先無法知道的文件名(包含版本我無法控制的數字)並將這些消息寫入相應的文件。

所以,我知道對於具有動態輸出的靜態輸入過濾器是如何完成的。 但是我不知道動態輸入和動態輸出是怎么做的。

我最喜歡的幻想解決方案

在 Python 應用程序中:

  • 創建一個自定義格式化程序,它添加一個包含目標日志文件名稱的字段(例如 rsyslog 的 syslogtag)

  • 添加一個 SyslogHandler 或類似於我的記錄器的東西。

在 rsyslog 或 logstash 配置中添加如下規則

<config of some logging system>
[filterfor] <field> -> write messages containing <value of field> to logfile /path/to/logs/<value of field>.log

完畢。

這是否可以開箱即用或(在logstash中)使用(尚未編寫)插件?

編輯:也許一個例子會闡明我在尋找什么。

以括號中的目標為示例的日志消息示例:

<group_a> Message that will end up only in "group_a.log"
<group_a> Another Message for "group_a.log"
<group_b> Some interesting message for "group_b.log"
<group_c> Message for "group_c.log"

這些基於匹配名稱的消息將最終出現在相應的日志文件中。 對於上面的示例,帶有其內容的日志文件將是:

/var/log/group_logs/group_a.log
   <group_a> Message that will end up only in "group_a.log"
   <group_a> Another Message for "group_a.log"

/var/log/group_logs/group_b.log
<group_b> Some interesting message for "group_b.log"

/var/log/group_logs/group_c.log
   <group_c> Message for "group_c.log"

所以它就像一個正則表達式,將匹配的名稱保存在一個組中並將其用作文件名。

以下解決方案適用於 logstash(無需插件)。

/path/logs/process-<unique-process-specific-id>.log每個進程輸出到一個單獨的文件,比如/path/logs/process-<unique-process-specific-id>.log 該文件將包含如下行:

<group> <rest of line>

然后你可以使用這個配置:

input {
  file {
    path => "/path/logs/process-*.log"
    start_position => beginning
  }
}

filter {
  grok {
    match => { "message" => "\A(?<group>[^ ]++) (?<rest>.*+)\z" }
  }
}

output {
  file {
    path => "/path/logs/group-%{group}.log"
    message_format => "%{rest}"
  }
}

因此,如果一個進程正在向/path/logs/process-foobar.log寫一行, /path/logs/process-foobar.log所示:

groupA Hello world!

.. 那么這將產生一個包含內容的日志文件/path/logs/group-groupA.log

Hello world!

rsyslog 的工作解決方案的工作原理如下:

  1. 所有日志消息都包含由(任意)開始和結束分隔符分隔的目標文件名。 它們只能用於包裝文件名(在這種情況下,我們使用[[作為開始和]]作為結束分隔符)
  2. 日志消息被發送到 local0 設施以將它們與其他消息分開。

rsyslog 配置中的重要部分是:

$template debugFile,"/var/log/%msg:R,ERE,1,DFLT:\[\[(.*)\]\]--end%.log"

通過正則表達式從消息生成日志文件的絕對路徑 - rsyslog 團隊提供的正則表達式檢查器/生成器在這里可能會有所幫助。

$template rawFormat,"%msg%\n"

輸出模板僅包含原始日志消息(主要是裝飾性的)。

local0.* ?debugFile;rawFormat

將此模板和格式用於發送到 local0 設施的所有日志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM