当我重新配置 syslog 时,我的应用程序日志不遵循新配置

当我重新配置 syslog 时,我的应用程序日志不遵循新配置

我有一个关于系统日志应用程序的问题。我使用 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);

相关内容