로그파일 설정 - syslog 에 대하여
일반적으로 로깅 기능은 syslog를 이용하여 어떻게 사용할 것인지 지정을 한다. 배포판 설치시 로그파일을 기록하는 패키지가 자동으로 설치된다. 이러한 역할을 하는 패키지가 syslogd 패키지이다.
# rpm -ql sysklogd
/etc/logrotate.d/syslog
/etc/rc.d/init.d/syslog
/etc/rc.d/rc0.d/K99syslog
/etc/rc.d/rc1.d/K99syslog
/etc/rc.d/rc2.d/S30syslog
/etc/rc.d/rc3.d/S30syslog
/etc/rc.d/rc5.d/S30syslog
/etc/rc.d/rc6.d/K99syslog
/etc/syslog.conf
/sbin/klogd
/sbin/syslogd
/usr/doc/sysklogd-1.3.31
/usr/doc/sysklogd-1.3.31/ANNOUNCE
/usr/doc/sysklogd-1.3.31/INSTALL
/usr/doc/sysklogd-1.3.31/NEWS
/usr/doc/sysklogd-1.3.31/README.1st
/usr/doc/sysklogd-1.3.31/README.linux
/usr/doc/sysklogd-1.3.31/Sysklogd-1.3.lsm
/usr/man/man5/syslog.conf.5.gz
/usr/man/man8/klogd.8.gz
/usr/man/man8/sysklogd.8.gz
/usr/man/man8/syslogd.8.gz
시스템 로깅 프로그램은 시스템의 부팅시 초창기에 실행이 된다. 이에 대한 설정은 /etc/syslog.conf를 이용한다. 아래 내용은 필자가 주석을 첨가하였다.
# cat /etc/syslog.conf
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
kern.* /dev/console
# 모든 커널 메시지를 콘솔로.
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none /var/log/messages
# 모든 info를 messages에 기록. 여기서 mail, authpriv 관련 기록은 제외
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# 모든 로그인 인증 관련 기록. su, login 등을 모두 여기 기록
# Log all the mail messages in one place.
mail.* /var/log/maillog
# 모든 메일 메시지
# Everybody gets emergency messages, plus log them on another
# machine.
*.emerg *
# 비상 메시지(emerg)는 현재 로그인한 모든 사용자에게 알림
# Save mail and news errors of level err and higher in a
# special file.
# uucp,news.crit /var/log/spooler
# uucp, news 의 crit 정보 기록
# Save boot messages also to boot.log
local7.* /var/log/boot.log
# 부트 메시지 기록
설정파일은 매우 간단하다. 빈 행과 # 으로 시작되는 행은 무시된다. (참고로 리눅스는 BSD 형식으로 로그를 구성한다)
설정행의 구조는 다음과 같다.
facility.level destination
facility는 메시지를 보내는 서브시스템의 이름이며 level(priority)은 메시지의 중요성을 나타낸다. facility는 다음과 같다.
auth, authpriv, cron, daemon, kern, lpr, mail, news, syslog, user, uucp, local0 - local7
facility에서 auth 대신 auth_priv를 사용할 것을 추천하고 있으며 나머지는 읽어보면 쉽게 이해가 갈 것이다. 크론(cron, at), 대몬, 커널 메시지, 로컬에서 사용, 프린터, 메일, 뉴스, syslog, 사용자 레벨 메시지, UUCP.
priority는 다음과 같으며 중요도에 따라 나열하고 있다.
debug, info, notice, warning, warn (warning), err, error (err), crit, alert, emerg, panic (emerg)
상세한 내용은 아래와 같다.
emerg : 시스템 패닉
alert : 에러 경고. 즉각 알려야할 내용
crit : 하드 장치 에러와 같은 임계 에러(critical error)
err : 에러
warn : 경고
notice : 비임계 메시지
info : 정보 메시지
debug :문제 추적을 돕는 특수 정보
만약 none 이라고 하면 그에 대한 모든 로그 메시지를 제외하라는 뜻이다.
모든 facility 나 priority 를 지정하려면 * 를 쓰면 되며 여러개를 지정하려면 , 를 사용하면 된다. 그런데 여기서 반드시 알아두야할것이 priority를 지정하면 그와같은 priority부터 그 위의 priority에 관련된 로그를 기록한다는 것이다. 만약 info 를 지정하면 emerg 부터 info 사이의 모든 로그를 기록한다. 만약 단일한 priority를 지정하려면 = 를 사용하면 된다. !는 priority 범위를 제한한다. 이에 대해서는 아래에서 설명하는 예를 참고하자.
(리눅스에서 syslogd는 원래 BSD 소스에 몇가지 기능이 추가되었다. =, ! 등이 이에 속한다.)
로그파일을 기록으로 남기는 방식에는 여러가지가 있다. 가장 먼저 파일형태(/var/log/messages), named pipe, 터미널과 콘솔(/dev/console), 원격 머신(@), 사용자, 로그인한 전체 사용자(*) 등이다.
보통 위의 내용이 일반적인 배포판 구성이다. 아마 kernel 메시지에는 주석이 되어있는 경우도 있다.
예를 들어 *.err /dev/tty8 를 추가해보자. 놀고있는 tty8 콘솔에서 시스템에서 발생하는 모든 에러를 볼 수 있다.
*.* @taejun
이건 모든 메시지를 taejun 이라는 원격 호스트에서 처리하도록 할 수 있다. 어떤 경우 이게 유용할까? 모든 syslog 메시지를 한 대의 시스템으로 모을 수 있기 때문에 여러대의 서버를 운영하는 경우 한곳에서 모든 로그를 처리할 수 있고 시스템에 문제가 발생하더라도 원격 시스템에 로그를 남기므로 설사 시스템이 붕괴가 되었다고 하더라도 문제를 찾을 실마리를 찾을 수 있다.
위의 기본 설정말고 몇가지 예를 더 보자.
# Store critical stuff in critical
#
*.=crit;kern.none /var/adm/critical
# 커널을 제외하고 모든 crit 에 해당하는 메시지 기록
# (여기서 = 를 지정한 차이점에 대해서 이해해야함)
# Kernel messages are first, stored in the kernel
# file, critical messages and higher ones also go
# to another host and to the console
#
kern.* /var/adm/kernel
kern.crit @finlandia
kern.crit /dev/console
kern.info;kern.!err /var/adm/kernel-info
# 커널 관련 모든 기록은 kernel 파일에,
# 커널에서 crit 이상의 메시지는는 콘솔과 원격 호스트로.
# 두번째 부분(원격 호스트)이 유용한 것은 만약 시스템이
# 붕괴해서 디스크에서 복구할 수 없는 에러가 났더라도
# 원격 호스트에서 이 문제를 해결할 수 있는 원인을
# 찾을 수 있다.
# 이제 네번째 줄. 이건 info 부터 err 이전 그러니깐
# info , notice, warn 에 대한 메시지를 기록한다.
# 로그 범위을 제한하는 것이다.
# The tcp wrapper loggs with mail.info, we display
# all the connections on tty12
#
mail.=info /dev/tty12
# mail.info에 관련된 메시지를 12번째 콘솔에 기록.
# Store all mail concerning stuff in a file
#
mail.*;mail.!=info /var/adm/mail
# mail.info 만 제외하고 모든 mail 메시지.
# Log all mail.info and news.info messages to info
#
mail,news.=info /var/adm/info
# mail 과 news의 info 만 기록
# Log info and notice messages to messages file
#
*.=info;*.=notice;\
mail.none /var/log/messages
# info 와 notice 에 해당하는 모든 메시지 기록.
# 여기서 mail의 모든 메시지만 제외.
# Log info messages to messages file
#
*.=info;\
mail,news.none /var/log/messages
# 모든 info 에 관련된 메시지.
# 단, 메일, 뉴스의 모든 메시지는 제외
# Emergency messages will be displayed using wall
#
*.=emerg *
# 모든 emergency 메세지를 현재 로그인한 모든 사용자에게.
# 이는 wall 과 같다.
# Messages of the priority alert will be directed
# to the operator
#
*.alert root,taejun
# 모든 alert 이상 메시지를 root 와 taejun 사용자에게
*.* @taejun
# 모든 메시지를 taejun 이라는 원격 호스트로
# 위에서 설명했던 것처럼 클러스터링 시스템에서
# 모른 로그 메시지를 한곳에 기록하는 경우 유용
logger 유틸리티는 쉘 스크립트에서 syslog 기능을 이용 메시지를 보낼 수 있다.
# logger -p authpriv.alert -t oh_no_login "test"
# tail -f secure
Jul 10 23:42:12 tunelinux oh_no_login: test
특정 시스템의 로그를 다른 원격 서버로 보내어 분석할 수 있다. 이에 대해서 설명을 한다.
먼저 확인해야 할 것이 있다.
/etc/services 파일에 아래의 내용이 있는지 확인해보자.
syslog 514/udp
로그를 만드는 쪽과 받는 쪽 두군데에서 다 필요하다. 보통 기본 설정되어있을 것입니다. 메시지를 주고받는데 UDP 포트가 필요하기 때문이다.
로그를 생성하는 서버에서 설정을 하자. /etc/syslog.conf 에 아래의 내용을 추가한다.
mail.info @admin
이건 mail.info 에 해당하는 로그를 admin 이라는 호스트로 보내는 것이다. 이왕이면 admin은 DNS에 문제가 생길 수도 있으므로 /etc/hosts에 등록해두는 것이 좋을 것이다. 필요하다면 *.* 을 이용 전부를 다 보낼 수도 있다. 이런 경우에는 시스템에 아주 심각한 문제가 생긴다고 하더라도 원격 호스트에 로그 파일이 남으므로 나중에 분석을 할 수 있다는 것이다.
이제 로그를 원격에서 받아 기록하는 서버의 설정을 한다. syslogd 대몬을 시작할때 추가 옵션이 필요하다. 레드햇(또는 호환 계열) 배포판의 경우 시작파일은 다음과 같은 형태이다.
/etc/rc.d/init.d/syslog
여기서 대몬을 시작하는 옵션으로
daemon syslogd -m 0 -r -h
이렇게 설정을 한다. 세부 옵션은 아래와 같다.
-m 0 : 기본설정되어있는것으로 변경하지 않아도 된다. 이건 지정한 분동안에 MARK 라고 로그파일에 기록을 한다. 0이면 기록을 하지 않는다.
-r : 인터넷 도메인 소켓을 이용해 네트웍에서 메시지를 받는 옵션
-h : 기본적으로 syslogd는 원격 호스트에서 받은 메시지를 로그 기록으로 전송하지 않는다. 이 옵션을 사용하여 원격 호스트에서 받은 로그파일을 전송한다. (전송이란 받은 쪽의 로그 파일에 기록한다고 생각하면 된다)