분류없음2013.07.19 16:28

 logrotate 개요

 로그의 비대화를 막기 위한 방법으로 로그 로테이션이 있다. syslog 다른 프로세스가 출력하는 파일은 방치해 나가면 자꾸자꾸 사이즈가 커져, 디스크 스페이스를 압박한다. 인스톨 할때는 /var 디렉토리의 디스크 점유율이 0%여도, 수주간, 수개월 경과하고 나서 시스템 장애가 터지고 나서 찾아보면, 디스크 사용률이 100%에 다다른 것을 발견할 지도 모른다. 이런 장애를 사전에 예방하기 위하여 출력되는 로그를 세대분 로테이션 시킬것인가를 미리 결정해 두면, 지정한 이상의 파일은 작성되지 않게 되고로그가 로테이션되므로 로그 사이즈의 비대화를 방지할 있다. RPM으로 패키지를 인스톨 하고 있다면, 거의 로그의 로테이션을 커스터마이즈 필요는 없지만, 소스로부터 컴파일 인스톨 했을 경우에는, 로그의 로테이션은 필수의 작업이다. 아직 용량이 많이 남아 있으니 다음에 하지 하고 방치하지 말고, 바로 지금 로그를 관리해보자.


http://linux.kororo.jp/img/line.gif

logrotate 인스톨

 RedHat 디폴트로 인스톨 되지만, 만약 인스톨 되어 있지 않으면 다음과 같이 인스톨 한다.

# rpm -q logrotate
# rpm -ivh logrotate-3.7.4-13.i386.rpm

http://linux.kororo.jp/img/line.gif 

/etc/logrotate.conf 설정

 logrotate 설정 파일은/etc 이하에 배치되어 있다. Weekly 1주간분 로그를 남긴다고 하는 의미이고,  rotate 4 4주간 분의 로그가 남는다는 의미. 이미 수주간 이상, Linux를 관리하고 있다면, /var/log 이하의 파일을 보면 알겠지만, messages, messages.1, messages.2 같이 로그가 로테이션 되고 있는 것을 확인 가능할것이다. 디폴트에서는, 4주간분을 로테이트 되는 설정으로 되어 있으므로, messages. 4까지는 작성되지만, 이후는, 파일내에서 로테이션 된다. 덧붙여 로그의 데이터량이 많은 경우에는, daily , rotate 횟수를 크게 주면 좋다.

# vi /etc/logrotate.conf

# see "man logrotate" for details
# rotate log files weekly
weekly 

# keep 4 weeks worth of backlogs
rotate 4 

# create new (empty) log files after rotating old ones
create 

# uncomment this if you want your log files compressed
#compress 

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d 

# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
} 


# system-specific logs may be also be configured here.

 

http://linux.kororo.jp/img/toumei_a.gif

 weekly

매주 로그를 바꾼다. 매일은 daily, 매월은 monthly

http://linux.kororo.jp/img/toumei_a.gif

 rotate 4

로그를 4세대분 남긴다. weeky 지정했을 경우는 4주간이라고 하는 의미가 된다.

http://linux.kororo.jp/img/toumei_a.gif

 create

(비어있는) 신규 로그 파일을 로테이션 직후에 작성한다

http://linux.kororo.jp/img/toumei_a.gif

 compress

압축한다. 디폴트에서는 압축하지 않게 되어 있으므로, 디스크의 용량을 보고, 유효하게 할지 판단한다.

http://linux.kororo.jp/img/toumei_a.gif

 include /etc/logrotate.d

로그 파일의 설정이 있는 패스를 지정한다. 직접, logrotate.conf 로테이션의 설정을 써도, 혹은, /etc/logrotate.d 이하에 파일을 작성해 거기에 로그 로테이트용의 설정 파일을 두어도 상관없다. RPM용의 로그 로테이션의 파일은/etc/logrotate.d 이하에 배치되어 있다.

http://linux.kororo.jp/img/toumei_a.gif

 /var/log/wtmp {

wtmp 로그 파일은 매월 1세대만 로그를 남기고, 소유자가 root 그리고 그룹이 utmp으로 퍼미션이 664 로그 파일을 작성한다 라는 의미.

http://linux.kororo.jp/img/toumei_a.gif


http://linux.kororo.jp/img/line.gif

/etc/logrotate.d 설정

  로그 파일의 설정은, /etc/logrotate.d 이하에 서비스마다 파일에 기술된다. 다음은 예시다.

# ls /etc/logrotate.d/
named
tomcat rpm samba squid syslog up2date


  syslog 파일을 보면 이하와 같이 되어 있다. 1행과 2행에서,  syslog가 남기는 파일의 패스가 기술되고 있고, sharedscripts, 이후에 기술된 처리를 와일드 카드의 지정에 관계없이, 한번만 실행한다고 하는 선언문이다. 처리의 실행은, postrotate ~endscript 사이에 기술한다. 기술되는 스크립트는 매우 중요한 역할을 가지고 있다. 만일 로그의 로테이션 후에 로그 파일에 로그를 토해내고 있던 프로세스가 로그 파일을 잃어 버리면, 이후에서는 로그가 채취되지 않게 되어 버린다. 회피책으로서 postrotate~endscript 사이에, syslog HUP 시그널을 보내, 재기동을 하는 것으로, 로테이션 후에 create 의해서 작성된 파일에 정상적으로 syslog 로그를 토해내도록 하고 있다.

# cat /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog
/var/log/spooler /var/log/boot.log /var/log/cron {
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}


logrotate 설정 예시(Apache)

 범위를 넓혀, Apache 로그의 로테이트를 간단히 설명하겠다. /etc/logrotate.d 밑에 httpd라는 파일을 작성한다. 파일명은 아무거나 써도 상관은 없다. 다만 내가 아닌 다른 시스템관리자도 알아보기 쉬운 이름으로 정하자.

# vi /etc/logrotate.d/httpd

/usr/local/apache2/logs/access_log /usr/local/apache2/logs/error_log {
      weekly
      rotate 4
      missingok
      sharedscripts
      postrotate
           /bin/killall -HUP `cat /usr/local/apache2/logs/httpd.pid 2>/dev/null` 2> /dev/null
      endscript
} 


다음은 로그의 로테이트를 테스트한다. -d옵션은 테스트를 위한 옵션으로 실제로는 로테이션 되지 않는다.

# $ /usr/sbin/logrotate -d /etc/logrotate.d/httpd

 

물론, /etc/logrotate.d/httpd 대신 /etc/logrotate.conf 파일을 지정하는것도 가능하나 /etc/logrotate.d디렉토리 이하의 로그가 전부 실행되므로 꼭 집어서 실행하자. 문제 없이 실행되었다면 실제로 실행해보자.

# /usr/sbin/logrotate /etc/logrotate.d/httpd
# cat /var/lib/logrotate.status
"/usr/local/apache2/logs/access_log" 2013-6-28
"/usr/local/apache2/logs/error_log" 20
13-6-28

 

logrotate.status는 오늘 날짜로 실행되었음을 보여주지만, 그 결과물access_log.1, error_log.1 생성되지 않았을것이다. logrotatelogrotate.status의 실행이력을 체크한 후에 로그 로테이트 작업을 실행한다. 따라서 초기 실행시에는 결과물이 나오지 않는다.

만일 1주일 후의 cron에 의한 결과물을 못기다리고, 지금 당장 결과물이 나오는걸 확인해보고 싶다면 다음과 같이 실행해보자. /var/lib/logrotate.status 편집해 일주일전 상태로 한다.

# vi /var/lib/logrotate.status
"/usr/local/apache2/logs/access_log" 20
13-6-21
"/usr/local/apache2/logs/error_log" 20
13-6-21


 편집 했다면, 다시 logrotate 실행한다. 이것으로, access_log.1 파일이 작성된다. 실제로, 파일의 내용을 보고, 로그가 과거의 것일지도 제대로 확인해 둔다.

http://linux.kororo.jp/img/line.gif

cron 의한 정기 실행

 logrotate demon으로서 가동하고 있는 것은 아니기 때문에, loglotate 자신이 스스로 로그의 로테이션을 실시하는 것이 아니고, cron 의해서 자동 실행되게 되어 있다. 스케쥴 시간이 되면 cron 의해서/etc/cron.daily/logrotate이라고 하는 스크립트가 불려 가고, 실행이 완료하면/var/lib/logrotate.status 결과 파일이 작성되고 이것을 보면 실제로 언제 로그의 로테이션을 했는지를 확인할 있다.  정상적으로 로그의 로테이션을 하고 있는지 어떤지 불안하면 확인해본다.

# cat /etc/cron.daily/logrotate
/usr/sbin/logrotate /etc/logrotate.conf

# cat /var/lib/logrotate.status
logrotate state -- version 2
"/var/log/named.log"  2013-6-13
"/var/log/rpmpkgs"  2013-6-25
"/var/log/messages"  2013-6-25
"/var/log/secure"  2013-6-25
"/var/log/maillog"  2013-6-25
"/var/log/spooler"  2013-6-25
"/var/log/boot.log"  2013-6-25
"/var/log/cron"  2013-6-25
"/var/log/up2date"  2013-6-13
"/var/log/wtmp"  2013-6-13
"/var/log/squid/access.log"  2013-6-25
"/var/log/squid/cache.log"  2013-6-25
"/var/log/squid/store.log"  2013-6-25
"/var/log/samba/log.nmbd"  2013-6-28
"/var/log/samba/log.smbd"  2013-6-28


http://linux.kororo.jp/img/line.gif

주된 logrotate 옵션

http://linux.kororo.jp/img/toumei_a.gif

 copy

로그 파일의 카피를 생성한다. 옵션을 사용하면, 이미 낡은 로그 파일이 존재하게 되므로, create 옵션은 무효가 된다.

http://linux.kororo.jp/img/toumei_a.gif

 copytruncate

카피의 작성 후에 로그 파일을 이동하는 대신에, 오리지날의 로그 파일을 아무것도 저장되지 않은 로그로 다시 만든다. 어느 프로그램이 로그 파일을 닫지 못하고, 언제까지 전의 로그 파일에 계속 쓰고 있는 경우 등에 유효한 옵션이다. 다만 파일을 카피하는 순간의 로그가 소실되는 가능성이 높다.

http://linux.kororo.jp/img/toumei_a.gif

 extention

로테이션 후의 백업 로그에 부가하는 확장자(extension) 지정한다. ext에는 파일의 확장자(extension)를을 지정한다. compress 옵션을 지정했을 경우에는, 여기서 지정한 확장자(extension) 뒤에,. gz등의 확장자(extension) 부가된다.

http://linux.kororo.jp/img/toumei_a.gif

 ifrotate

만약 로그 파일이 공백이었다고 해도 로테이션 시킨다. 디폴트로 유효하게 되어 있다.

http://linux.kororo.jp/img/toumei_a.gif

 mail

로그 파일의 로테이션이 완료한 시점에서, mail 옵션의 인수로서 설정된 메일 주소에 메일을 보낸다.

http://linux.kororo.jp/img/toumei_a.gif

 mailfirst

mail 옵션 사용시에, 로테이션 예정의 파일을 메일로 출력한다.

http://linux.kororo.jp/img/toumei_a.gif

 maillast

mail 옵션 사용시에, 로테이션 파일을 메일로 출력한다.

http://linux.kororo.jp/img/toumei_a.gif

 missingok

로그 파일이 발견되지 않았던 경우, 에러 메세지를 출력하지 않고 다음의 로그 파일의 처리로 이행한다.

http://linux.kororo.jp/img/toumei_a.gif

 size

size 옵션의 파라미터로서 수치보다 로그 파일의 사이즈가 경우, 로그 파일의 로테이션을 실시한다."M"(메가)"K"(킬로) 지정할 있다.

http://linux.kororo.jp/img/toumei_a.gif

 start

로테이션 하는 경우에, 부가되는 숫자의 확장자를 몇부터 시작하는지를 지정한다. 디폴트에서는 1 이다.

http://linux.kororo.jp/img/toumei_a.gif

 

Posted by 별한줌

티스토리 툴바