我有一个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-缩进(新的日志消息从一行的开头开始。如果某行以空格或制表符“ t”开头,则它是该日志消息之前的一部分)
需要说明的是,由于它不是像imfile那样消耗的静态数据,因此需要一个计时器,1s或类似的东西,如果没有收到新数据,则我们假设日志条目已终止
答案 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
的命令来停止缓冲。