服务器每小时都会创建一个格式为 syslog_all.yyyy-mm-dd-hh 的新日志文件,并存档前一小时的文件。
我需要的是一种方法来 grep 查找特定字符串的当前和尚未创建的日志文件,而不必仅仅因为文件名已更改而每小时重新启动命令。
目前我这样做:
tail -f syslog_all.2017-04-25-09 | egrep -i --line-buffered "string1" | egrep -i "(.*first.*|.*second.*|.*third.*)"
答案1
这是一个高级食谱。
- 配置 syslogd 或 rsyslogd(无论您的系统使用哪个)以将所需的设施/优先级消息输出到命名管道以及它现在所在的位置。摘自
man rsyslog.conf
Named pipes This version of rsyslogd(8) has support for logging output to named pipes (fifos). A fifo or named pipe can be used as a des‐ tination for log messages by prepending a pipe symbol ('|') to the name of the file. This is handy for debugging. Note that the fifo must be created with the mkfifo(1) command before rsys‐ logd(8) is started.
我的中有一个例子/etc/rsyslog.d/50-default.conf
daemon.*;mail.*;\
news.err;\
*.=debug;*.=info;\
*.=notice;*.=warn |/tmp/rt_monitor
创建一个命名管道并使用 tail 和 grep 从管道中读取和搜索。
mkfifo /tmp/rt_monitor; tail -f /tmp/rt_monitor | grep "alert string"
如果您没有让消费者运行,您应该检查命名管道已满时系统是否继续运行并防止这种情况发生,我给了您一个非常残酷的秘诀。