我已配置 rsyslog 将某些日志消息转发到命名管道/tmp/logger.pipe
。然后我有一个单独的进程从命名管道读取数据。相关部分来自/etc/rsyslog.conf
# Remote Logging (silly conditional rule needed for specific logging scenario)
$template RFC5424Format,"<%PRI%>1 %timegenerated:1:10:date-rfc3339%T%timegenerated:12:19:date-rfc3339%.%timegenerated:21:26:date-rfc3339%Z %HOSTNAME% - - -%msg%\n"
if ($msg contains 'remote="true"') then /tmp/logger.pipe;RFC5424Format
/tmp/logger.pipe 的权限
prwxrwxrwx 1 ftp root
我正在将此应用程序部署到两台不同的机器上。一台机器配备 rsyslog v3.xx,另一台机器配备 v5.xx
该应用程序在使用 rsyslog v5.xx 的计算机上运行良好,但是,我在使用 rsyslog v3.xx 的计算机上遇到奇怪的行为具体来说:
- rsyslogd 有时需要很长时间才能在初始启动时启动(在我添加新规则之前非常快)。
- 当进程读取
logger.pipe
重新启动时,rsyslogd 似乎在侦听进程恢复后停止将数据写入命名管道。解决此问题的唯一方法是手动重新启动 rsyslogd
在使用命名管道时,我缺少 rsyslog 配置的一些技巧吗?我可能忽略的其他权限问题吗?我对该应用程序充满信心,因为它在 v5.xx rsyslog 版本中运行得非常稳定。不幸的是,我无法在遇到问题的机器上更新 v3.xx 版本。
有什么想法吗?
更新:我可能已经诊断出这个问题 - 这似乎是一个问题,如果没有读者,rsyslogd 会关闭到管道的写入连接。但是,读取器应用程序使用 fopen(),它会阻塞,直到出现相应的写入器为止。
由于某种原因,这在 rsyslog v5.xx 上不是问题:
- rsyslogd 和 logger.out 成功打开管道的初始状态
- 在 _logger.out 上重新启动问题,rsyslogd 仍然有对管道的写入打开
- _logger.out 恢复并且一切再次正常运行
但这种行为在 rsyslog v3.xx 上有所不同:
- rsyslogd 和 logger.out 成功打开管道的初始状态
- 在 _logger.out 上重新启动问题,rsyslogd 由于某种原因关闭了与管道的连接
从 rsyslog 文档来看,目标应该包含一个管道符号。此修改解决了我的问题,即使读取器关闭,rsyslog 也会保持与命名管道的打开连接。
我无法解释为什么这只是 rsyslog v3.xx 上的问题。