다른 위치로 로그 메시지 보내기

다른 위치로 로그 메시지 보내기

C 프로그램과 Perl 스크립트의 메시지를 파일(예: /var/log/my_log)로 보내고 싶습니다. syslog 데몬 구성에 대한 액세스 권한이 없으므로 다른 syslog 데몬(syslog-ng)을 시작하려고 했습니다.

logger명령과 해당 옵션을 사용하여 -u명령줄에서 메시지를 보낼 수 있습니다 . 이 로그 메시지는 일반적인 메시지 파일 대신 my_log에 기록되지만 C나 Perl에서는 동일한 동작을 재현할 수 없습니다.

분명히 openlog 함수에는 로깅에 사용되는 소켓, 로깅 프로세스의 PID를 지정하는 옵션 또는 시스템 로그 대신 내 로그에 메시지를 보낼 수 있는 옵션이 없습니다.

syslog라이브러리를 사용하여 수행할 수 있습니까, 아니면 불가능합니까?

답변1

맞습니다. libc에서는 openlog()소켓을 지정할 수 없지만 일반적으로 별도의 소켓이 필요한 경우에만 가능합니다 syslogd(A.소켓물론 메시지가 기록된 파일과 동일하지는 않습니다. )

logger기본값은 (대부분의 시스템에서라고 생각합니다) user.notice이므로 올바른 위치에 기록되면 C에서 다음과 같이 해야 합니다.

#include <syslog.h>
  ...
  openlog("myprog",LOG_PID,LOG_USER);
  syslog(LOG_INFO,"%s","my message...");

또는 Perl에서는:

use Sys::Syslog qw(:DEFAULT setlogsock);
setlogsock 'unix';   
# setlogsock('unix','/opt/my_root/dev/log');

openlog("myprog","pid","user");
syslog("info","my message...");

상수에 대한 자세한 내용은 매뉴얼 페이지 openlog(3)와 매뉴얼 페이지를 참조하십시오.Sys::Syslog(3)

정말로 다른 소켓에 로그인하고 싶다면 /dev/log위의 두 번째 형식을 사용하여 Perl에서 쉽게 로그인할 수 있습니다. setlogsocket()최신 패키지를 사용해야 할 수도 있는데 Sys::Syslog, 경로를 지정할 때 v0.17에서 실패한 것으로 나타났습니다.

C에서는 조금 까다롭습니다. 소켓 connect()에 연결 하고 연결 해야 합니다.AF_UNIXwrite()올바른 메시지 형식 사용. logger(함수 myopenlog()및 ) 의 최신 소스 코드를 읽어 보시기 바랍니다 .mysyslog()유틸리티-리눅스-2.x버전.

Linux(glibc) 및 FreeBSD에서 사용되는 경로는 openlog()하드코딩( _PATH_LOGfrom /usr/include/syslog.h)되어 있으며 런타임에 이를 변경할 수 있는 방법이 없습니다(chroot 또는 .soDLL 주입 제외).

관련 정보