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_UNIX
write()
올바른 메시지 형식 사용. logger
(함수 myopenlog()
및 ) 의 최신 소스 코드를 읽어 보시기 바랍니다 .mysyslog()
유틸리티-리눅스-2.x버전.
Linux(glibc) 및 FreeBSD에서 사용되는 경로는 openlog()
하드코딩( _PATH_LOG
from /usr/include/syslog.h
)되어 있으며 런타임에 이를 변경할 수 있는 방법이 없습니다(chroot 또는 .so
DLL 주입 제외).