2

我正在使用命名管道来捕获系统日志消息。然后我可以通过执行类似的操作轻松查看系统日志

cat /var/log/local3.pipe | grep somefilter
or
grep somefilter /var/log/local3.pipe

这些都很好地将系统日志输出到控制台。但是,如果我想将其捕获到文件中,我什么也得不到,例如

cat /var/log/local3.pipe | grep somefilter >> somefile.log
or
grep somefilter /var/log/local3.pipe >> somefile.log

该文件始终保持为零字节。有谁知道为什么?我正在使用 Red Hat Enterprise Linux 5。谢谢。

附加信息:对于想要重现此内容的任何人,这里是命令的完整列表

su
<enter root password>
mkfifo /var/log/local3.pipe
chmod 644 /var/log/local3.pipe
echo "local3.* |/var/log/local3.pipe" >> /etc/syslog.conf
/etc/init.d/syslog restart
exit

然后使用一个 ssh 会话:

cat /var/log/local3.pipe

并在第二个 ssh 会话中(“测试它”应该显示在第一个 ssh 会话中

logger -p local3.info "Test it"

然后在第一个会话中将其更改为

cat /var/log/local3.pipe >> somefile.log

向本地 3 发送更多日志(消息需要不同)。确认消息进入 somefile.log

logger -p local3.info "Test it 2"

然后在第一个会话中将其更改为

cat /var/log/local3.pipe | grep -i test >> somefile.log

现在确认日志不会进入 somefile.log

请注意,该消息需要与上一条消息不同,否则记录器不会立即发送它。

4

1 回答 1

2

我可以重现您的问题,这为我解决了问题:

cat /var/log/local3.pipe | grep -i --line-buffered test >> somefile.log

isatty(3)我认为原因是当标准输出引用终端时(根据 因此,您必须somefile.loggrep进程的标准输出缓冲区被填充之前检查过,因此在它有任何理由写入文件之前。

另一种强制行缓冲的方法如下:

cat /var/log/local3.pipe | stdbuf -oL grep -i test >> somefile.log

您可以在这两篇很棒的文章中阅读有关所有这些的更多信息:

(我很高兴地注意到这stdbuf是一个今天给我发电子邮件的人写的关于完全不同的东西 - 小世界!)

于 2013-03-06T01:41:12.743 回答