我有一个关于系统日志应用程序的问题。我使用 syslog API 编写了一个简单的程序。我编译并启动了该程序。它有效,我可以看到日志上的日志。
但是,当我重新配置 syslog 以将日志发送到远程服务器时,该程序继续在本地发送日志。远程系统日志服务器正在工作,我检查 并可以在远程端logger -p daemon.info test: testing log
看到消息。testing log
一旦我重新启动程序,它就可以工作,并且日志被发送到远程服务器。
因此,当 syslog 守护进程重新启动时,似乎 syslog 应用程序需要重新启动?
代码
#include <syslog.h>
#include <stdio.h>
#include <unistd.h>
int main(){
setlogmask (LOG_UPTO (LOG_NOTICE));
int i = 0;
openlog ("exampleprog", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
while (1){
syslog (LOG_NOTICE, "Program started by User %d, msg numer %d", getuid (),++i);
sleep(2);
}
closelog ();
return 0;
}
编译并运行
gcc test.c && ./a.out
重现
- 未配置远程系统日志服务器
- 编译并启动程序
- 配置远程系统日志服务器 => 程序不会将日志发送到远程服务器。
- 重新启动程序 => 日志存在于远程服务器中。
本地和远程的 Distrib 和 rsyslog 版本为 ubuntu-20.04 和 rsyslogd 8.2001.0
答案1
最后,chatGPT 给了我答案。
为了避免每次更改 syslog 配置后都必须重新启动程序,您可以考虑使用
syslog()
带有LOG_ODELAY
选项的函数而不是选项LOG_NDELAY
。该LOG_ODELAY
选项会导致 syslog API 在每次发送日志消息时重新读取配置文件,确保对 syslog 配置的更改立即反映在您的程序中。
syslog
而手册页上的答案并不明确:
LOG_ODELAY
的相反
LOG_NDELAY
;连接的打开被延迟,直到syslog()
被调用。 (这是默认的,不需要指定。)
所以改变:
openlog ("exampleprog", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
到
openlog ("exampleprog", LOG_CONS | LOG_PID, LOG_LOCAL1);