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_ODELAY
LOG_NDELAY
LOG_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);