syslog를 재구성하면 내 애플리케이션 로그가 새 구성을 따르지 않습니다.

syslog를 재구성하면 내 애플리케이션 로그가 새 구성을 따르지 않습니다.

syslog 애플리케이션에 대해 질문이 있습니다. syslog API를 사용하여 간단한 프로그램을 작성했습니다. 나는 프로그램을 컴파일하고 시작했다. 작동하며 로그에서 로그를 볼 수 있습니다.

그러나 원격 서버에 로그를 보내도록 syslog를 재구성하면 프로그램이 계속해서 로컬로 로그를 보냅니다. 원격 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

다시 나타나다

  • 원격 syslog 서버가 구성되지 않았습니다.
  • 프로그램 컴파일 및 시작
  • 원격 syslog 서버 구성 => 프로그램이 원격 서버에 로그를 보내지 않습니다.
  • 프로그램을 다시 시작하세요 => 원격 서버에 로그가 존재합니다.

로컬 및 원격 Distrib 및 rsyslog 버전은 ubuntu-20.04 및 rsyslogd 8.2001.0입니다.

답변1

마침내 chatGPT가 나에게 답을 주었다.

syslog 구성을 변경할 때마다 프로그램을 다시 시작하지 않으려면 options 대신 options 와 syslog()함께 함수를 사용하는 것을 고려할 수 있습니다 . 이 옵션을 사용하면 로그 메시지가 전송될 때마다 syslog API가 구성 파일을 다시 읽게 되므로 syslog 구성에 대한 변경 사항이 프로그램에 즉시 반영됩니다.LOG_ODELAYLOG_NDELAYLOG_ODELAY

syslog그리고 매뉴얼 페이지의 답변은 명확하지 않습니다.

LOG_ODELAY

반대로 LOG_NDELAY연결 열기는 syslog()호출될 때까지 지연됩니다. (기본값이므로 지정할 필요가 없습니다.)

따라서 다음을 변경하십시오.

openlog ("exampleprog", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);

도착하다

openlog ("exampleprog", LOG_CONS | LOG_PID, LOG_LOCAL1);

관련 정보