로그 레벨 지정
커널 메시지는 그 중요도에 따라 레벨을 정하고 이를 커널 메시지 선두에 표현하는 방법을 사용하는데, 이를 로그 레벨이라 한다.
상수 선언문 |
의미 |
#define
KERN_EMERG |
“<0>” /* 시스템이
동작하지 않는다. */ |
#define
KERN_ALERT |
“<1>” /* 항상 출력된다. */ |
#define KERN_CRIT |
“<2>” /* 치명적인
정보 */ |
#define KERN_ERR |
“<3>” /* 오류 정보 */ |
#define
KERN_WARNING |
“<4>” /* 경고 정보 */ |
#define
KERN_NOTICE |
“<5>” /* 정상적인
정보 */ |
#define KERN_INFO |
“<6>” /* 시스템
정보 */ |
#define KERN_DEBUG |
“<7>” /* 디버깅
정보 */ |
레벨에 대한 표시를 하지 않는다면 KERN_WARNING와 같은 레벨로 처리 된다.
ex) printk(KERN_INFO "system ok\n");
printk("<6>" "system ok\n");
printk("<6>system ok\n");
다음 세 문장의 의미는 같다.
원형 큐 구조 관리
커널 메시지는 콘솔 디바이스로 바로 출력되지 않고, 커널 내부에 있는 원형 큐 형식의 로그 버퍼라는 저장 공간에 저장된다. 이 로그 버퍼의 크기는 CONFIG_LOG_BUF_SHIFT 값으로 지정되는데, 2의 승수로 크기를 표현한다. 이 값은 include/config/log/buf/shift.h에 정의되어 있는데, 디폴트 값이 14이므로 로그 버퍼의 크기는 16 Kbyte 다.
커널 메시지를 저장하는 로그 버퍼는 출력하는 콘솔 디바이스와 데이터를 기록하는 로그 프로그램에 연결되어 있다. 그래서 printk() 함수에 의해 로그 버퍼에 저장되는 속도보다 데이터를 가져가는 속도가 느려서 로그 버퍼의 크기를 초과하면 가장 오래된 데이터가 손실된다.