rsyslog配置合并通过imuxsock来的多行

时间:2019-05-16 22:26:15

标签: systemd rsyslog

我有一个Web服务,将其输出写到stdout并由systemd管理。 systemd配置将stdout发送到syslog。我的问题是多行消息被拆分为多个系统日志条目。这是异常堆栈跟踪特别存在的问题。有什么方法可以配置rsyslog将它们合并到一个条目中?我发现了一些使用readMode的{​​{1}}属性的解决方案,它确实满足了我的需要,但就我而言,我直接从默认的imfile接收数据。

我正在使用的测试正在运行

imuxsock

这会生成

echo -e "<<hello\n\tsecond\n\tthird\nnew message>>" | logger -t my-tag

但是我想得到的是

May 16 17:06:46 host my-tag: <<hello
May 16 17:06:46 host my-tag:    second
May 16 17:06:46 host my-tag:    third
May 16 17:06:46 host my-tag: new message>>

这可能吗? 该行为可以描述为May 16 17:06:46 host my-tag: <<hello second third May 16 17:06:46 host my-tag: new message>> 的readMode

中的模式2。
  

2-缩进(新的日志消息从一行的开头开始。如果某行以空格或制表符“ t”开头,则它是该日志消息之前的一部分)

需要说明的是,由于它不是像imfile那样消耗的静态数据,因此需要一个计时器,1s或类似的东西,如果没有收到新数据,则我们假设日志条目已终止

1 个答案:

答案 0 :(得分:0)

您可以使用omprog rsyslog模块尝试将数据线缝合在一起。例如,配置

$ModLoad omprog
:syslogtag, isequal, "my-tag:" action(type="omprog"
    binary="/bin/myprog" output="/var/log/myoutput")

将运行程序/bin/myprog并使用my-tag标签将所有输入传递给它。程序的所有输出将保存到文件/var/log/myoutput

下面的示例程序使用awk脚本,该脚本使用printf打印行,而没有终止换行符。类似地,将打印具有以制表符开头的消息部分的输入(此处将其用rsyslog转义为八进制#011)。在没有选项卡的任何输入之前,将打印换行符,新消息也将打印。我让您添加刷新超时时间。

#!/bin/sh
awk '
/my-tag: #011/{
     i = index($0,"#011")
     printf "\n\t%s",substr($0,i+4)
     next
}
{    if(NR>1)printf "\n"; fflush();
     printf "%s",$0
}'

请注意,这是gnu awk(gawk),它具有一个fflush()命令。否则,您可能需要类似stdbuf的命令来停止缓冲。