繁体   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