티스토리 뷰

C | C++

시스템 로그

야라바 2018. 6. 29. 11:00
728x90

☞ openlog, syslog, closelog, setlogmask

<syslog.h>

void openlog(const char *ident, int option, int facility);
void syslog(int facility_priority, const char *format, ...);
void closelog();
int setlogmask(int mask);

시스템 내의 주요 대몬과 프로세스들이 관리자등에 통보하거나 조사 자료나 보고서 자료의 기반으로 사용하기 위해 남기는 메시지들은 대부분의 시스템에서 syslog라는 이름으로 운용됩니다. 통상 syslogd 또는 klogd와 같은 대몬이 "/dev/log"를 매개로 유닉스 소켓을 생성해서 메시지를 받아 처리하게 됩니다. 로컬 시스템에서는 연결 기반의 유닉스 소켓으로 메시지를 남길 수 있지만 원격 시스템에서도 UDP 데이터그램을 통해서 메시지를 남길 수 있습니다. 이런 과정은 모두 syslog()에서 처리해 줍니다. syslog()로 로그 메시지를 남길 수 있는데 openlog(), syslog(), closelog() 단계를 밟을 수도 있지만 openlog(), closelog() 없이 syslog()를 호출하면 기본 설정으로 로그를 남깁니다.



☞ 예제1

......
if (!openlog_done)
{
    openlog(syslog_ident ? syslog_ident : "postgres",
            LOG_PID | LOG_NDELAY | LOG_NOWAIT,
            syslog_facility);
    openlog_done = true;
}
......
if (syslog_sequence_numbers)
    syslog(level, "[%lu-%d] %s", seq, chunk_nr, buf);
else
    syslog(level, "[%d] %s", chunk_nr, buf);
......
if (openlog_done)
{
    closelog();
    openlog_done = false;
}
......

위의 코드는 PostgreSQL DBMS 코드의 일부입니다. 플래그(openlog_done)를 가지고 프로그램 실행중 1회만 openlog()를 수행하고 전체 작업 종료시 closelog()를 수행한 점을 참조할만 합니다. openlog()의 첫 인수 ident는 로그를 남기는 주체를 알려주는 것으로 기본값은 프로그램 이름입니다. 두번째 인수 option에는 예제와 같은 방식으로 다음과 같은 것들을 사용할 수 있습니다.

  • LOG_PERROR : 메시지를 syslog에 남기는 것과 동시에 표준 에러 스트림으로도 출력
  • LOG_CONS : syslog 메시지 저장이 실패하면 시스템 콘솔에 출력
  • LOG_PID : PID를 메시지에 포함시킴
  • LOG_NDELAY : 유닉스 소켓으로 연결



openlog()와 syslog()에서 설정하는 장치코드(facility)는 다음과 같습니다.

  • LOG_USER : 기타 사용자 프로세스. 기본값
  • LOG_MAIL : 메일 시스템
  • LOG_DAEMON : 기타 시스템 대몬
  • LOG_AUTH : 보안, 사용자 관리
  • LOG_SYSLOG : Syslog
  • LOG_LPR : 중앙 프린터
  • LOG_NEWS : 네트워크 뉴스
  • LOG_UUCP : UUCP
  • LOG_CRON : Cron, At
  • LOG_AUTHPRIV : 개인 보안
  • LOG_FTP : FTP 서버



syslog()에서는 장치코드에 부가해서 다음과 같은 우선순위 또는 레벨을 지정합니다.

  • LOG_EMERG : 시스템 불능 상태
  • LOG_ALERT : 즉시 조치가 이뤄져야 하는 작업
  • LOG_CRIT : 심각한 상태
  • LOG_ERR : 에러
  • LOG_WARNING : 경고
  • LOG_NOTICE : 정상이나 중요한 정보 통지
  • LOG_INFO : 단순 정보
  • LOG_DEBUG : 디버깅 목적의 메시지



setlogmask()는 특정 레벨의 로그를 무시하게 합니다. 비트 마스크 형태로 지정하는데, 비트가 ON 이면 정상적으로 처리하고 비트가 OFF면 해당 레벨의 메시지를 무시합니다. LOG_MASK(LOG_EMERG) | LOG_MASK(LOG_ERROR) 처럼 지정할 수 있습니다.




728x90

'C | C++' 카테고리의 다른 글

지수와 로그 함수  (0) 2018.06.29
삼각 함수  (0) 2018.06.29
터미널 IO  (0) 2018.06.29
데이터 그램 소켓 사용하기  (0) 2018.06.17
연결 기반으로 소켓 사용하기  (0) 2018.06.17