2009. 12. 18. 08:31

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>


int main(int argc, char *argv[])

{

    char *progname;

    if ((progname = strrchr(argv[0], '/')) == NULL)

        progname++;

    else progname = argv[0];
// NOTICE 레벨까지의 메시지만을 기록한다.
    setlogmask (LOG_UPTO (LOG_NOTICE));

 // 로그 메시지 셋팅.
    openlog (progname, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);

// 메시지를 기록
    syslog (LOG_NOTICE, "Program started by User %d", getuid ());

// NOTICE까지 기록하기로 설정했으니, 아래의 메시지는 기록되지 않는다.
    syslog (LOG_INFO, "A tree falls in a forest");

    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
Posted by devanix