Translate

12/04/2013

linux server management 7

logrotate 이용한 로그 파일 관리
보안과 시스템을 관리하고 운영하는 측면에서 로그파일이 중요하지만 계속 쌓이기만 하는 로그파일을 그대로 둔다면 시스템에 문제가 발생할 가능성이 크다. 소규모로 서버를 운영하는 경우 로그파일에 그다지 신경을 쓰는 일이 없다. 그렇지만 제공하는 서비스가 많아지고 규모가 커질 경우 예상치 못한 곳에서 문제가 생기는 일이 많다. 그중 하나가 엄청나게 증가하는 로그파일문제이다. 메일의 경우를 예로 들어보자. 전자메일이 전송된 경우 필자의 시스템에서는 maillog와 messages에 동시에 기록이 된다. pop3도 마찬가지이다. 전자메일을 전송하는 경우에는 560바이트 정도 되었고 pop3로 메일을 가져올 경우에는 500바이트 정도 되었다. 여기서 메일주소가 잘못되어 반송된 경우에 남은 로그는 1.2k 정도가 되었다. 웹서버 로그를 보자. 웹서버 로그의 경우 로그기록을 어떻게 하느냐에 따라 다른데 common이 아니라 access, agent, referer를 모두 기록하는 combined를 이용할 경우 한번 접속당 160바이트가 증가한다. common에 비해서는 두배이상 되는 규모이다. Mysql에서도 모든 sql문에 대하여 기록을 남기는 기능을 이용할 경우 db에서 진행되는 모든 sql문이 로그파일에 그냥 기록이 되므로 규모가 큰 파일을 dump하여 다시 import 하였을 경우 로그 파일의 규모가 dump 크기에 비례하여 엄청나게 늘어난다. 로그파일의 크기가 늘어나서 불필요한 하드디스크 공간이 낭비되고 심지어 서비스가 중지될 정도로 심각한 상황이 초래될 수가 있다. 더 나아가 서비스하는데 투여되어야 할 시스템 자원이 로그파일을 기록하는데 데에만 신경을 써서 정작 서비스 자체의 속도나 질이 형편없이 떨어질 가능성도 크다.


리눅스에서 로그 로테이션을 담당하는 패키지가 logrotate 이다.


# rpm -qa | grep logrotate
logrotate-3.3-1



# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/usr/man/man8/logrotate.8.gz
/usr/sbin/logrotate



logrotate는 계속 커지는 로그파일을 효율적으로 관리하기 위한 프로그램이다. 자동으로 로테이션을 시켜주고, 압축, 제거, 메일로 보내주기 등의 작업을 한다. 초기 리눅스 설치시 자동으로 cron에 추가가 된다.



# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf


위에서 보면 logrotate 가 프로그램이고 logrotate.conf가 설정파일이라는 것을 알 수 있을 것이다. 위에서 .conf 파일대신 특정 디렉토리를 지정하면 그 해당 디렉토리의 모든 파일을 사용해 작업을 한다. logrotate 에 여러가지 옵션이 있지만 그다지 사용할 일은 없을 것 같다. 혹시나 궁금하면 man 으로 확인해보면 된다.


먼저 rotate 에 대해서 설명하겠다. rotate 3 라면 cron 로그라고 했을 경우를 가정해본다.. /var/log 디렉토리에 cron이 제일 처음 생성되고 순환간격마다 예전 cron 은 cron.1 이, cron.1은 cron.2, cron.2 는 cron.3 으로 된다. 기존의 cron.3은 삭제가 될 것이다. 그러니깐 새로 생성한 메일로그외에 이전의 로그를 3개까지 기록하는 것이다.


설정파일을 살펴보자. 한글로 되어있는 부분은 필자가 주를 단 것이다.


# cat /etc/logrotate.conf


# see "man logrotate" for details
# rotate log files weekly
weekly
# 기본적으로 일주일마다 로그파일을 순환시킴


# keep 4 weeks worth of backlogs
rotate 4
# 이전 로그파일을 4주동안 간직.
# 위에서 순환간격을 1주일로 했으므로.


# send errors to root
errors root
# 에러가 생길경우 root 에게 메일로.


# create new (empty) log files after rotating old ones
create
# 예전 로그파일을 순환시킨후 새로운 로그파일 생성


# uncomment this if you want your log files compressed
#compress
# gzip 을 이용 압축한다.


# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# /etc/logrotate.d 파일 또는 디렉토리 안에 있는 파일을 읽어들인다.
# 참고로 필자의 서버에는 다음과 같은 기본설정 파일이 있다.
# ls /etc/logrotate.d
# apache cron ftpd named syslog
# 여기서 가장 중요한 syslog는 messages, secure, maillog, spooler,
# bootlog 로 구성


# no packages own lastlog or wtmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
# 매월마다 순환시킴
# create 는 순환후 즉시 (postrotate 스크립트를 실행시키기전에)
# 로그 파일을 생성한다. 뒤에서 설명할 것이지만 postrotate는
# 로그파일을 순환한후 진행할 작업을 명시한다.
# 0664 는 생성하는 파일의 허가권, root 는 소유자, utmp 는 그룹
# rotate 1 은 위에서 설명했다. 그런데 개별적으로 설정하면
# 초기에 설정한 weekly 는 무시되 개별 설정을 따른다
# 그러므로 여기에서는 이전의 로그파일이 1개만 남을것이다.
# (원본 제외)
# 참고로 기본적으로 syslog에서는 600으로 허가권을 설정한다.
# 다른 누구도 로그파일에 접근하면 안되기 때문이다.


/var/log/lastlog {
monthly
rotate 1
}
# system-specific logs may be configured here



몇가지 주요한 옵션에 대해서 설명을 하겠다.


ㅇ 순환할 기간 설정 : daily, weekly, monthly 등.
여기에 size 를 이용해 크기까지 설정할 수 있다.접속이 많아서 로그파일이 엄청나게 늘어나는 경우에는 size(기본 kilobytes)를 이용 제어해야 할 것이다.
size 100k(= size 100)


ㅇ 압축설정 : compress
gzip으로 이전 로그파일을 압축한다. 공간을 절약할 수 있다. 이 옵션을 없애려면 주석을 달든지 아니면 nocompress(기본값) 사용


ㅇ 메일설정 : error, mail
error taejun -> 에러를 taejun 이라는 사용자에게 보냄
mail taejun -> 로그파일을 순환시키고 나중에 삭제해야 할 때 삭제하지 않고 메일로 보냄


ㅇ 로그파일 생성 : create mode owner group (기본값)
create 를 지정하면 순환후 로그 파일을 생성한다. 반대는 nocreate


ㅇ 순환간격 : rotate count
이전 로그파일이 삭제되거나 메일로 보내기전에 순환을 할 횟수 지정. 여기서 0으로 지정하면 예전 로그파일은 무조건 삭제된다.


ㅇ 지정한 로그파일이 없을 경우 : missingok, nomissingok
로그파일이 없으면 기본은 에러를 낸다(nomissingok, 기본값). missingok 를 지정하면 로그파일이 없더라도 에러를 내지는 않는다.


ㅇ 로그파일의 내용이 없을 경우(비어있을경우)
기본은 ifempty로 내용이 비었어도 순환을 한다.
순환을 하지 않도록 하려면 notifempty 를 지정하면 된다.


ㅇ 순환 후 작업 : postrotate/endscript
순환하기전 작업을 하려면 prerotate/endscript 를 사용한다. 일반적으로는 순환후 작업을 할 것이다. 예를 들어 메일관련 로그를 새로 생성했으면 syslogd를 다시 가동시켜야 할 것이다. 이런것들을 지정한다.


ㅇ 파일 또는 디렉토리 포함 : include
다른 파일이나 디렉토리안의 파일을 포함할 경우



위의 내용을 토대로 메일 로그를 조정해보자.


여기서는 /etc/logrotate.d/syslog 에서 메일서버의 로그만 따로 처리를 해보겠다.


# cat /etc/logrotate.d/maillog
weekly
size 500k
rotate 4
compress
errors admin
mail admin
nomissingok
create 0600 root root
/var/log/maillog {
postrotate
/usr/bin/killall -HUP syslogd
endscript
}


/var/log/messages {
postrotate
/usr/bin/killall -HUP syslogd
endscript
}
매주마다 한번식 순환시키고 크기가 500k가 넘지 않도록 하며 순환한 파일은 압축을 한다. 에러를 admin 이라는 사용자에게 보내고 순환후 삭제할 파일을 메일로 admin 에게 보낸다. 만약 로그파일이 없으면 에러를 내며 순환후 파일을 생성시키고 이 파일의 모드는 0600 으로 소유자와 그룹은 root 로 한다.


웹서버를 여러 대 운영하고 있고 하루에 한번씩 로그파일을 로테이션시킨다면 logrotate 설정에 중앙의 로그분석 서버로 보내는 작업을 집어넣는 것도 좋은 방법이다. 이런 경우에는 ncftput등의 명령이나 rsync를 이용할 수 있는데 필자는 rsync를 즐겨 쓰는 편이다. (**주4) 알아두면 편리한 프로그램으로 시스템간의 자료 동기화에 주로 사용하며 미러 서버를 운영하는 경우에도 많이 사용하고 있다.


임시파일 관리에 대하여
리눅스 및 유닉스 시스템에서는 상황에 따라 필요하면 임시파일을 생성한다. 보통 /tmp나 /var/tmp를 이용하며 이외에도 맨페이지 등에서 사용하는 임시파일이 있다. 이런 역할을 하는 프로그램이 tmpwatch 패키지이다. cron.daily에 설정이 되어 자동으로 작동을 하도록 되어 있다.


# cat /etc/cron.daily/tmpwatch
/usr/sbin/tmpwatch 240 /tmp /var/tmp
[ -d /var/cache/man ] && /usr/sbin/tmpwatch -f 240 /var/cache/man/{X11R6/cat?,cat?,local/cat?}
[ -d /var/catman ] && /usr/sbin/tmpwatch -f 240 /var/catman/{X11R6/cat?,cat?,local/cat?}


필요에 따라 임시파일을 생성하는 경우가 있는데 이것이 악용이 된다면 시스템을 공격하는데 사용될 수가 있다. 또한 불필요한 파일 때문에 하드 디스크 공간을 낭비하는 일은 없어야 할 것이다. 위의 스크립트가 아니라고 하더라도 find 명령을 이용하여 일정한 시간이 지난 파일을 주기적으로 삭제하는 것도 한가지 방법이다.


여기까지 읽었다면 시스템의 로그가 어떻게 작성되고 어떻게 관리를 해야할지 감을 잡았을 것이다. 위에서는 주로 일반적인 로그에 대해 다루었지만 자신이 사용하고 있는 서비스에 따라 적절한 설정을 하여야 한다. 이에 대해서는 위의 예제나 기본 설정되어 있는 내용을 참고로 하면 그다지 어렵지 않게 설정 가능할 것이다. 최근에 필자가 데이터베이스 작업을 하면서 자꾸만 시스템에 문제가 생기는 경우가 발생하였다. 알고보니 Mysql의 로그에 sql문의 로그를 기록하는 형태로 되어 있다보니 대용량의 자료를 넣다보면 넣은 양만큼 로그파일이 꽉 차게 되는 경우였다. 웹서버 Apache를 rpm이 아니라 직접 컴파일해서 설치한 경우 자동으로 로그로테이션이 되지 않기 때문에 아파치 로그파일 때문에 하드 디스크가 꽉 차서 어려움을 겪은 시스템 엔지니어도 보았다. 이와 같이 시스템 로그가 아니라고 하더라도 많이 사용하고 있는 서비스에 대해서는 로그 파일도 신경을 써야 한다.