等待同步的rsyslog现在冲洗完成

问题描述 投票:1回答:2

我正在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
flush rsyslog
2个回答
0
投票

这似乎有点重量级的解决方案,但你可以使用系统的inotify API等待要关闭的日志文件(HUP信号的结果)。例如,

inotifywait -e close ./dump_hook_log

将挂起,直到rsyslogd(或过程)关闭文件,当您将收到消息

./dump_hook_log CLOSE_WRITE,CLOSE 

并计划将与返回码0退出,您可以添加一个暂停。


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        
}
© www.soinside.com 2019 - 2024. All rights reserved.