[英]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 的工作解决方案的工作原理如下:
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.