syslogd는 유저 어플리케이션이 syslog APIs를 사용하여 남기는 로그를 기록하고 관리하기 위해서 사용되는 데몬이다. 하지만 커널 프로그램에서는 메세지를 남기기 위해서 사용자 어플리케이션용인 syslog APIs를 사용하지 못하기 때문에 syslogd으로 로그 메세지를 남길 수 없다. 따라서 커널 프로그램에서 printk를 사용하여 출력하는 메세지는 바로 syslogd로 가지 못하며, klogd이 받아 이를 syslogd으로 넘겨주게 된다. 참고로 유저 어플리케이션에서 syslogd로 메세지를 남길 때는 아래 함수들을 사용한다.
#include < syslog.h >
void openlog( char *ident, int option, int facility)
void syslog ( int priority, char *format, ...)
void closelog( void )
커널 로그 메세지는 dmesg 명령으로 볼수 있으며, /proc/kmsg 에서도 확인할 수 있다.
#dmesg
혹은 klogd을 죽이고
#cat /proc/kmsg
printk는 커널내의 메모리상의 circular로깅 버퍼에 기록되므로 인터럽트 처리 루틴에서도 호출이 가능하다. klogd은 항상 이를 모니터링하며 데이터를 읽어서 syslogd로 보내주는데 이때 circular buffer가 clear되므로 /proc/kmsg를 사용하여 모니터링하고자 할 때는 klogd를 죽여야 한다.
만일 기대한 로그가 보이지 않는다면, 현재 로그 레벨이 너무 높아서일 수 있다. 높은 로그 레벨에서는 높은 우선 순위의(중요한) 메세지들만 기록된다. 로그 레벨은 값이 작을수록 높은 우선 순위를 가지며, 0~7사이의 값을 가진다.
아래 명령으로 현재 로그 레벨을 알 수 있다.
# cat /proc/sys/kernel/printk
4 4 1 7
이는 각각 현재 로그 레벨, 기본 로그 레벨, 최소 허용 로그 레벨, 부트시 기본 로그 레벨에 해당한다. 이중 현재 로그레벨은 아래와 같이 변경할 수 있다.
echo 8 > /proc/sys/kernel/printk
가장 낮은 로그레벨이 7이므로 위와 같이 8로 설정하면, 모든 커널 로그 메세지를 볼 수 있다.
참고 사이트:
http://www.linuxjournal.com/article/4036?page=0,2