Linux C | printf를 syslog로 어떻게 리디렉션합니까?

Linux C | printf를 syslog로 어떻게 리디렉션합니까?

지금까지 우리는 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이 경우 loggerstdio API를 통해 수행되지 않는 경우(예: direct 를 사용 write(1, data, length)하고 fd 1이 다른 것으로 리디렉션되지 않는다고 가정하는 경우)를 포함하여 by 및 그 하위 항목의 모든 출력이 로 리디렉션됩니다.

-oLsetlinebuf(stdout)이 코드를 실행 파일에 삽입하여 위와 동일한 효과를 얻으십시오. 프로그래밍한 경우(또는 호출하는 다른 프로그램도 영향을 받음) 그렇지 않으면 호출이 setvbuf()동적으로 연결되지 않거나 setuid/setgid입니다...


¹ 실제 stdout/fd가 아닌 stdio FILE*객체 1이므로 프로그램이 하위 프로세스에서 다른 명령을 실행하더라도 영향을 받지 않습니다.

관련 정보