如何使用rsyslog和imfile正确解析文本文件

Son*_*its 5 rsyslog

美好的一天

我想使用imfile文件输入模块将文本文件导入rsyslog.但是,rsyslog没有像我预期的那样解析文本文件的内容,而且我正在努力寻找关于它是如何完成的文档.为了测试设置,我正在使用imfile读取文本文件,然后使用omfile将日志写入另一个文本文件.

文本文件的内容是"标准"syslog格式的日志:

<PRI>TIMESTAMP HOSTNAME MESSAGE
Run Code Online (Sandbox Code Playgroud)

我要导入Rsyslog的示例文本文件(example_file.txt.)如下所示:

<34>Feb 15 12:12:12 hostname1 tag1: message1
<34>Feb 16 12:12:12 hostname2 tag2: message2
<34>Feb 17 12:12:12 hostname3 tag3: message3
Run Code Online (Sandbox Code Playgroud)

我在rsyslog-d中的rsyslog配置文件如下所示:

module(load = "imfile")
input(type = "imfile" file = "/home/.../Desktop/example_file.txt" Tag = "example")
action(type = "omfile" file = "/home/.../Desktop/example_output.log")
Run Code Online (Sandbox Code Playgroud)

example_output.log中的结果输出如下所示:

Feb 15 17:10:21 username example <34>Feb 15 12:12:12 hostname1 tag1: message1
Feb 15 17:10:21 username example <34>Feb 16 12:12:12 hostname1 tag2: message2
Feb 15 17:10:21 username example <34>Feb 17 12:12:12 hostname1 tag3: message3
Run Code Online (Sandbox Code Playgroud)

如您所见,example_file.txt中的所有内容都放在example_output.log中生成的日志的MSG字段中,而不是使用字段信息并将它们放在正确的位置,例如TIMESTAMP,HOSTNAME,TAG,MSG .我在.txt文件中使用了不同的格式,甚至将.txt文件保存为.log文件,但rsyslog每次都将整个内容放在MSG字段中.

那我的问题是:

如何告诉rsyslog和imfile我的.txt内容实际上是日志并正确解析它们?

考虑到:

  1. 我正在使用Linux v4.4.0-ubi4-amd64(UbiLinux)进行Up-Board工作

  2. 我使用的是rsyslog8.24(最新稳定版)

  3. 我已经读完了:

    -Rsyslog官方文档,

    -Imfile官方文档,

    -Rainer Gerhards在rsyslog中的syslog解析(http://www.rsyslog.com/doc/syslog_parsing.html),

    - 甚至是BSD Syslog协议RFC3164的文档(http://www.ietf.org/rfc/rfc3164.txt)

小智 2

您可以使用模板从消息中提取字段。这是一个示例模板。

template(name="structured-format" type="list") {
   constant(value="{")
       property(outname="pri" name="msg" field.number="1" field.delimiter="32" format="jsonf") 
       constant(value=", ")
       property(outname="hostname" name="msg" field.number="4" field.delimiter="32" format="jsonf") 
       constant(value=", ")
       property(name="msg" format="jsonf")
   constant(value="} \n")
}
Run Code Online (Sandbox Code Playgroud)

您可以在输出中使用此模板,如下所示。

action(type = "omfile" file = "/home/.../Desktop/example_output.log" template="structured-format") 
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

{"pri":"<34>", "hostname":"hostname1", "msg":"<34>Feb 15 12:12:12 hostname1 tag1: message1"}
Run Code Online (Sandbox Code Playgroud)

也就是说,我还没有弄清楚如何从 msg 中排除已解析的字段,而只将剩余的字段添加到 msg 字段中。希望这些指示对您有所帮助。