SYSNOPSIS |
void openlog(const char *ident, int option, int facility); void syslog(int priority, const char *format, ...); void closelog(void); int setlogmask(int maskpri); |
syslog
syslog 함수는 syslogd 데몬에게 메시지를 전송한다.
syslogd 데몬은 받은 메시지를 파일에다 기록하거나, 화면에다 출력하거나, 다른 호스트에 있는 또다른
syslogd 데몬에게 포워딩한다.
첫번째 priority 인자는 로그 메시지에 중요성을 결정하며, 우선순위는 가장 순위가 높은 LOG_EMERG에서
가장 순위가 낮은 LOG_DEBUG에 이르는 계층적인 구조를 가지고 있다.
매크로 |
실제값 |
설명 |
LOG_EMERG |
0 |
A panic condition. This is normally broadcast to all users. |
LOG_ALERT |
1 |
A condition that should be corrected immediately, such as a corrupted system database. |
LOG_CRIT |
2 |
Critical conditions, e.g., hard device errors. |
LOG_ERR |
3 |
Errors. |
LOG_WARNING |
4 |
Warning messages. |
LOG_NOTICE |
5 |
Conditions that are not error conditions, but should possibly be handled specially. |
LOG_INFO |
6 |
Informational messages. |
LOG_DEBUG |
7 |
Messages that contain information normally of use only when debugging a program. |
두번째와 세번째는 printf 함수와 같은 포맷 문자열과 불확정 매개변수(?)이다.
openlog
openlog는 syslog 함수를 호출하기전에 호출하는 사전작업이라고 생각됩니다.
일반적으로 application에서 syslog를 호출하기 위해서는 첫번째 하는일이 Unixdomain datagram socket 과
syslogd daemon을 통해 만들어진 /var/run/log 소켓에connect하는 함수를 호출합니다.
하지만 openlog 함수는 이러한 소켓을 만들지 않습니다. openlog함수는 syslog 함수가 호출 되기 전에 호출할 수 있으며
void openlog(const char *ident, int options, int facility); |
openlog는 혼자 동작되는 것이 아니며 syslog 호출을 위해서 여러가지 option을 setting하는 일을 합니다.
위에서 설명된 것을 기초로 openlog함수는 동작하며 openlog를 호출한다고 해서 자동적으로 syslog 함수가 호출되는 것은 아닙니다.
로그 파일에다가 뭔가 특별한 처리를 해야 하는 경우에는, openlog 함수를 이용해야 한다.
첫번째 ident 인자는 모든 로그 문자열 앞에 붙을 ID 문자열이다. 보통은 프로그램 이름을 명기한다.
두번째 option 인자는 로그 방식에 대한 플래그이다. (LOG_CONS, LOG_NDELAY, LOG_PID 등.. 맨페이지 참조)
세번째 facility 인자는 어떤 프로그램이 로그를 생성했는가에 대한 플래그이다.
일반적으로 LOG_USER 또는 LOG_LOCAL0 ~ LOG_LOCAL7을 사용하면 된다.
setlogmask 함수를 이용해, 어느 수준까지의 로그를 실제로 로그할 것인지를 정해줄 수 있다. LOG_UPTO 매크로를 이용하면 좀 더 간단하다.
2 예제
2.1 로그에다 쓰기
#include <stdio.h> #include <string.h> #include <stdarg.h> #include <syslog.h> #include <unistd.h> #include <sys/types.h>
{ char *progname; if ((progname = strrchr(argv[0], '/')) == NULL) progname++; else progname = argv[0]; // 로그 메시지 셋팅. // 메시지를 기록 // NOTICE까지 기록하기로 설정했으니, 아래의 메시지는 기록되지 않는다. closelog (); return 0; |
2.2 로그 읽어들이기
위의 쓰기 예제에서 생성한 로그는 보통 /var/log/messages 나 /var/log/syslog파일에 기록된다.
참조:
JOINC WIKI - SYSLOG 사용하기(1).
JOINC WIKI - SYSLOG 사용하기(2).
'API 및 라이브러리 > C 라이브러리 함수' 카테고리의 다른 글
system(3) (0) | 2009.12.19 |
---|---|
getusershell(3) (0) | 2009.12.19 |
getutent(3) (0) | 2009.12.17 |
ttyname(3) (0) | 2009.04.04 |
memcpy(3) (0) | 2009.04.03 |