我正在rsyslogd 8.24.0与当地的日志文件。
我有一个运行的程序,做一些syslog日志记录(从我的测试将要经由rsyslog.conf设置另一个文件项),然后退出返回到一个shell脚本来检查日志已预期的内容进行测试。这通常工作,但有时会失败,就像记录没有发生。我添加了一个冲洗(使用HUP信号)的shell脚本它做检查之前。我可以看到HUP已经发生和正确的条目在日志中,但脚本的检查仍然失败。是否有shell脚本等待,直到冲洗完成的方法吗?我可以添加任意的睡眠,但希望有更多的东西肯定的。
下面是shell脚本中的相关内容:
# Set syslog to send dump_hook's logging to a local logfile...
sudo echo "user.* `pwd`/dump_hook_log" >> /etc/rsyslog.conf
sudo systemctl restart rsyslog.service
echo "" > ./dump_hook_log
# run the test program which does syslog logging
kill -HUP `cat /var/run/syslogd.pid` # flush syslog
if [ $? -ne 0 ]
then
logFail "failed to HUP `cat /var/run/syslogd.pid`: $?"
fi
echo "sent HUP to `cat /var/run/syslogd.pid`"
grep <the string I want> ./dump_hook_log >/dev/null
有问题的字符串总是通过该测试报告的时间dump_hook_log失败,我已经去看待它。我相信它一定是冲洗未通过grep的的时间内完成。
下面是一个例子:在/ var /日志/消息
2019-01-30T12:13:27.216523+00:00 apx-ont-1 apx_dump_hook[28279]: Failed to open raw dump file "core" (Is a directory)
2019-01-30T12:13:27.216754+00:00 apx-ont-1 rsyslogd: [origin software="rsyslogd" swVersion="8.24.0" x-pid="28185" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
日志文件的日期国防部(注:这是比它包含的条目前面!):
rw-rw-rw- 1 nealec appexenv1_group 2205 2019-01-30 12:13:27.215053296 +0000 testdir_OPT/dump_hook_log
最后一行中的日志文件(在这里只apx_dump_hook项)的:
2019-01-30T12:13:27.216523+00:00 apx-ont-1 apx_dump_hook[28279]: Failed to open raw dump file "core" (Is a directory)
脚本错误报告:
Wed 30 Jan 12:13:27 GMT 2019 PSE Test 0.2b FAILED: 'Failed to open raw dump file' not found in ./dump_hook_log
这似乎有点重量级的解决方案,但你可以使用系统的inotify
API等待要关闭的日志文件(HUP信号的结果)。例如,
inotifywait -e close ./dump_hook_log
将挂起,直到rsyslogd
(或过程)关闭文件,当您将收到消息
./dump_hook_log CLOSE_WRITE,CLOSE
并计划将与返回码0退出,您可以添加一个暂停。
我想我现在明白这一点。该HUP导致rsyslogd关闭其打开的文件,但直到它需要登录到它,它不会重新打开文件。考虑以下几点:我使用的inotify等待文件关闭,就像这样:
case 9:
{
// Wait for the file, specified in argv[2], to be closed
int inotfd = inotify_init();
if (inotfd < 0) {
printf("inotify_init failed; errno %d: %s\n",
errno, strerror(errno));
exit(99);
}
int watch_desc = inotify_add_watch(inotfd, argv[2], IN_CLOSE);
if (watch_desc < 0) {
printf("can't watch %s failed; errno %d: %s\n",
argv[2], errno, strerror(errno));
exit(99);
}
size_t bufsiz = sizeof(struct inotify_event) + PATH_MAX + 1;
struct inotify_event* event = static_cast<inotify_event*>(malloc(bufsiz));
if (!event) {
printf("Failed to malloc event buffer; errno %d: %s\n",
errno, strerror(errno));
exit(99);
}
/* wait for an event to occur with blocking read*/
read(inotfd, event, bufsiz);
}
然后在我的shell脚本我等待:
# Start a process that waits for the log file be closed
${bin}/test_dump_hook.exe 9 "./dump_hook_log" &
wait_pid=$!
# Signal syslogd to cause it it close/reopen its log files
kill -HUP `cat /var/run/syslogd.pid` # flush syslog
if [ $? -ne 0 ]
then
logFail "failed to HUP `cat /var/run/syslogd.pid`: $?"
fi
wait $waid_pid
我觉得这是永远不会返回。日志文件的发送HUP从另一个进程rsyslogd不破出来的等待下去,但猫(它打开/关闭文件)中。
这是因为在shell脚本HUP之前,其他进程等待有人做过。因此,文件已被关闭,在等待的开始,因为没有更多的记录到文件时,它不会重新打开,不需要关闭接收到任何后续HUPs时,这样的事件永远不会发生,结束等待。
已经明白这种行为我怎么能肯定,在我检查日志已经被写入?我已经走了这个解决方案;把一个已知的消息到日志,等到出现,我知道我在等条目必须是在此之前。像这样:-
function flushSyslog
{
logger -p user.info -t dump_hoook_test "flushSyslog"
# Signal syslogd to cause it it close its log file
kill -HUP `cat /var/run/syslogd.pid` # flush syslog
if [ $? -ne 0 ]
then
logFail "failed to HUP `cat /var/run/syslogd.pid`: $?"
fi
# wait upto 10 secs for the entry we've just logged to appear
sleeps=0
until
grep "flushSyslog" ./dump_hook_log > /dev/null
do
sleeps=$((sleeps+1))
if [ $sleeps -gt 100 ]
then
logFail "failed to flush syslog dump_hook_log"
fi
sleep 0.1
done
}