지금까지 우리는 printf를 사용해 왔으며 출력은 stdio로 전송됩니다. 이제 stdio에서 이를 제거하고 syslog에 넣으려고 합니다.
나는 큰 코드 기반을 가지고 있으므로 모든 printf를 교체하는 것은 좋은 생각이 아닙니다.
몇 가지 아이디어는 freopen() 또는 dup()/dup2()를 사용하는 것이지만 나는 이것이 완전히 마음에 들지 않습니다.
이걸 어떻게 보관할 수 있는지 아는 사람 있나요?
답변1
한 가지 접근 방식 은 로그 메시지 형식을 지정하고 이를 syslog로 보내는 힘든 작업을 수행하는 stdout
파이프로 1을 변경하는 것입니다 .logger
char cmd[64];
sprintf(cmd, "logger -t your-program -p daemon.info --id=%d", getpid());
stdout = popen(cmd, "w");
setlinebuf(stdout);
(오류 처리는 연습으로 남겨두었습니다)
또는 프로그램을 전혀 수정하지 말고 다음과 같이 실행하십시오.
sh -c 'echo "$$"; exec stdbuf -oL your-program' |
(
IFS= read -r pid &&
exec logger -p daemon.info -t your-program --id="$pid"
)
your-program
이 경우 logger
stdio API를 통해 수행되지 않는 경우(예: direct 를 사용 write(1, data, length)
하고 fd 1이 다른 것으로 리디렉션되지 않는다고 가정하는 경우)를 포함하여 by 및 그 하위 항목의 모든 출력이 로 리디렉션됩니다.
-oL
setlinebuf(stdout)
이 코드를 실행 파일에 삽입하여 위와 동일한 효과를 얻으십시오. 프로그래밍한 경우(또는 호출하는 다른 프로그램도 영향을 받음) 그렇지 않으면 호출이 setvbuf()
동적으로 연결되지 않거나 setuid/setgid입니다...
¹ 실제 stdout/fd가 아닌 stdio FILE*
객체 1이므로 프로그램이 하위 프로세스에서 다른 명령을 실행하더라도 영향을 받지 않습니다.