레이블이 syslogd인 게시물을 표시합니다. 모든 게시물 표시
레이블이 syslogd인 게시물을 표시합니다. 모든 게시물 표시

2015년 4월 14일 화요일

로그 출력하며 저장하기

임베디드 시스템 설계 시 유지/보수 및 디버깅을 위한 로깅은 일반적으로 serial interface를 사용하여 구현된다.  이는 시스템의 특정 serial interface를 표준 입출력 및 에러로 지정하는 것으로 printf를 사용한 로그 메세지가 serial 로 출력되며 따라서 serial interface가 연결된 상태에서만 로깅이 가능하므로 개발이나 유지 보수에 불편한 점이 많다.

만일 기기 내부에 임시로 로그를 저장하거나, 로그의 양을 조절하기 위한 우선순위 지정등의 추가 기능이 필요할 경우 이를 위한 자체 로깅 API를 작성하거나 혹은 시스템에서 제공하는 syslog()등의 사용을 고려할 수 있다.  하지만 재빌드가 불가능한 3rd party library등에서 printf를 사용하고 있다면 여기에 새 로깅 API를 적용할 수는 없다.

위와 같이 별도의 로깅 시스템이 고려되지 못한 상황에서 표준 출력과 표준 에러에만 의존하는 프로그램을 로깅하기 위해서 아래와 같은 방법을 사용할 수 있다.

# program 2>&1 | tee /tmp/log.txt
  • program : 프로그램명
  • 2>&1 : 표준 에러를 표준 출력과동일한 곳으로 설정
  • | :표준 출력을다음 프로그램의 표준 입력으로전달 
  • tee : 표준입력을 표준출력으로 보내면서 동시에 인자로 지정 된 경로에 전달

2010년 4월 8일 목요일

Linux Logging : syslogd vs klogd

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