메뉴 닫기

아파치 로그 로테이트

apache1

아파치에서 사이트 접속자가 많아 로그파일 용량이 계속 증가할 경우 서버 부하의 원인이 될 수 있습니다.

효과적으로 여러 로그로 나눠 저장하는 방법을 rototagelogs, logrotate, cronlog 를 통해 살펴보도록 하겠습니다.

1. rototagelogs

아파치 여러 툴 중 하나입니다. 설정 후 아파치를 실행할 경우 자동으로 실행됩니다.

서비스 설정이 되어 있는 아파치 설정파일을 엽니다.

 

 

# vi /usr/local/apache/conf/extra/httpd-vhosts.conf

기존 설정값에 Customlog 와 ErrorLog를 수정합니다.

 

CustomLog “|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/www.smilecast.co.kr-access-%Y-%m-%d.log 86400” combined
ErrorLog “|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/www.smilecast.co.kr-error-%Y-%m-%d.log 86400”

여기서 %Y-%m-%d 부분은 현재 년, 월, 일 입니다.
86400은 초 단위 값이며, 이 수치를 환산하면 24시간 주기로 한번씩 로그파일이 새로 생성되게 설정됩니다.

자정 12시에 저장할 경우 GMT 기준 시간이므로 한국시간으로 환산하면 9시간(60*9초)를 추가하면 됩니다.
즉, 86400 뒤에 +540을 추가하면 됩니다.

combined 부분은 httpd.conf의 LogFormat 설정의 별명이며, 설정되어있는 별명으로 선택하시면 됩니다.

<IfModule log_config_module>
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
LogFormat “%h %l %u %t \”%r\” %>s %b” common

… (이하생략)

 

시간 주기가 아닌 용량으로 설정할 경우 86400 부분 대신 원하는 용량 단위를 입력하면 됩니다.

 

CustomLog “|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/www.smilecast.co.kr-access-%Y-%m-%d.log 100M” combined

ErrorLog “|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/www.smilecast.co.kr-error-%Y-%m-%d.log 100M”

 

아파치 로그폴더의 파티션 용량이 부족할 경우 다음과 같이 오래된 기간의 파일을 삭제 스크립트를 예약해두면 됩니다.

 

 

#!/bin/bash

find /usr/local/apache/logs/*-access-*.log -ctime +180 \-exec rm -f {} \;
find /usr/local/apache/logs/*-error-*.log -ctime +180 \-exec rm -f {} \;

 

생성된지 180일이 경과된 파일만 삭제합니다.

 

2. cronolog

cronolog 는 아파치 로그를 날짜별로 나눠주는 설치 프로그램입니다.

http://cronolog.org 사이트를 통해 소스 다운로드하여 설치합니다.

– cronolog 다운로드

# wet http://cronolog.org/download/cronolog-1.6.2.tar.gz

※ 소스 원본 위치는 위와 같으나 작성일 현재 사이트 접근이 안되고 있으므로 우회 주소를 공유합니다.
# wget http://fossies.org/linux/www/cronolog-1.6.2.tar.gz

※ 웹 다운로드 주소 (구글)
http://code.google.com/p/vps/downloads/detail?name=cronolog-1.6.2.tar.gz&can=2&q=

– cronolog 설치

# tar xvfz cronolog-1.6.2.tar.gz

# cd cronolog-1.6.2

# ./configure –prefix=/usr/local/cronolog —> 설치 위치는 달리 지정할 수 있으며, 여기서는 편의상 /usr/local 밑에 설치하도록 하겠습니다.

# make && make install

– cronolog 셋팅

서비스 설정된 httpd.conf 또는 httpd-vhosts.conf 파일을 열어 CustomLog, ErrorLog 에 다음과 같이 셋팅해줍니다.

CustomLog “|/usr/local/cronolog/sbin/cronolog /usr/local/apache/logs/www.smilecast.co.kr-access.log.%Y-%m-%d” combined
ErrorLog “|/usr/local/cronolog/sbin/cronolog /usr/local/apache/logs/www.smilecast.co.kr-access.log.%Y-%m-%d”.%Y-%m-%d”

 

셋팅이 완료되었으면 저장하고 나와서 아파치를 restart 해주면 적용된다.

 

 

-rw-r–r– 1 root root 1871795 11월 24 23:58 www.smilecast.co.kr-access.log.2014-11-24
-rw-r–r– 1 root root 88849 11월 24 2-:12 www.smilecast.co.kr-error.log.2014-11-24
-rw-r–r– 1 root root 1689622 11월 25 23:55 www.smilecast.co.kr-access.log.2014-11-25
-rw-r–r– 1 root root 31234 11월 25 21:45 www.smilecast.co.kr-error.log.2014-11-25
-rw-r–r– 1 root root 1345345 11월 26 23:51 www.smilecast.co.kr-access.log.2014-11-26
-rw-r–r– 1 root root 43223 11월 26 18:36 www.smilecast.co.kr-error.log.2014-11-26
-rw-r–r– 1 root root 567432 11월 27 13:28 www.smilecast.co.kr-access.log.2014-11-27
-rw-r–r– 1 root root 16765 11월 27 11:12 www.smilecast.co.kr-error.log.2014-11-27

 

 

3. logrotate

logrorate는 리눅스 기본 시스템 로그 파일들의 설정으로, rotatelogs, cronlog와는 달리 자동적으로 오래된 파일을 삭제해주므로 더욱 편리하게 사용할 수 있습니다.

/var/log 폴더를 보면 일정 기간 단위로 시스템 로그 파일들이 분리되어 있는것을 볼 수 있습니다.

acpid btmp.1 httpd messages.2 rpmpkgs.4 secure.7 vbox
anaconda.log conman lastlog messages.3 rpmpkgs.5 secure.8 wtmp
anaconda.syslog conman.old mail messages.4 rpmpkgs.6 setroubleshoot xferlog
audit cron maillog messages.5 rpmpkgs.7 spooler xferlog.1
boot.log cron.1 maillog.1 messages.6 rpmpkgs.8 spooler.1 xferlog.2
boot.log.1 cron.2 maillog.2 messages.7 samba spooler.2 xferlog.3
boot.log.2 cron.3 maillog.3 messages.8 scrollkeeper.log spooler.3 xferlog.4
boot.log.3 cron.4 maillog.4 pm secure spooler.4 xferlog.5
boot.log.4 cron.5 maillog.5 ppp secure.1 spooler.5 xferlog.6
boot.log.5 cron.6 maillog.6 prelink secure.2 spooler.6 xferlog.7
boot.log.6 cron.7 maillog.7 rpmpkgs secure.3 spooler.7 xferlog.8
boot.log.7 cron.8 maillog.8 rpmpkgs.1 secure.4 spooler.8 yum.log
boot.log.8 dmesg messages rpmpkgs.2 secure.5 squid
btmp faillog messages.1 rpmpkgs.3 secure.6 tallylog

 

이런 로그파일들은 logrotate를 통해 기본적으로 설정이 되어있으며 아래와 같습니다.

/etc/logrotate.conf 파일내용입니다.

 

 

 

# see “man logrotate” for details

# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 5

# 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
minsize 1M
create 0664 root utmp
rotate 1
}

/var/log/btmp {
missingok
monthly
minsize 1M
create 0600 root utmp
rotate 1
}

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

 

이 파일에 설정되어있는 wtmp처럼 아래에 설정할 수 있지만 추가할 로그파일이 많아질경우
/etc/logrotate.d 폴더 내에 파일을 생성해서 개별적으로 추가할 수 있습니다.

apache 라는 파일을 생성해서 아파치 로그파일들을 로테이션 설정해보겠습니다.

 

/usr/local/apache/logs/*_log {
daily
rotate 8
missingok
create 0600 root root
postrotate
/bin/kill -HUP `cat /usr/local/apache/logs/httpd.pid 2>/dev/null` 2> /dev/null || true
endscript
}

 

 

daily
– 어느 시간에 한번씩 로테이션을 돌릴지를 정합니다. daily, weekly, monthly, yearly 등으로 설정할 수 있고,
daily의 경우 하루에 한번씩 로그 파일을 생성합니다.

rotate 8
– 로그 파일을 8개까지 생성하겠다는 의미이며 주기가 돌아올경우 .1 로그 파일은 .2가 됩니다.
.8의 로그 파일은 .9가 되므로 서버에서 자동으로 삭제됩니다.

postrotate ~ end스크립트
– 로테이션이 실행된 직후 자동으로 작업할 스크립트를 작성하는 부분입니다.
로테이션이 실행되기 직전에 작업할 경우 postrotate 대신 prerotate를 쓰시면 됩니다.
위와 같이 아파치를 재시작을 하고 스크립트를 닫습니다.

여기서 아파치를 재시작 해야 하는 이유는 로테이션이 실행된 후라도 아파치 프로세스는 계속 실행중이기 때문에
로그 파일명이 변경되었더라도 그 곳에 계속 쌓입니다.

다시 설명하면, access_log 가 access_log.1 가 되어도 재시작을 하지않으면 새로 쌓일 경우 access_log.1 로 쌓이게 되는 것입니다.
이 경우 스크립트 대신 logrotate 옵션값으로 copytruncate 를 이용하는것이 가능합니다.
작업시 파일명 변경(move)이 아닌 동일 파일을 다른 이름으로 복사(copy)하기 때문입니다.

위와같은 설정으로 아파치 로그는 아래와 같이 쌓이게 됩니다.

 

 

-rw——- 1 root root 0 11월 27 04:02 access_log
-rw——- 1 root root 0 11월 26 04:02 access_log.1
-rw——- 1 root root 0 11월 23 04:02 access_log.2
-rw——- 1 root root 0 11월 16 04:02 access_log.3
-rw——- 1 root root 0 11월 9 04:02 access_log.4
-rw——- 1 root root 237 11월 7 10:08 access_log.5
-rw——- 1 root root 7246 11월 1 10:11 access_log.6
-rw——- 1 root root 0 10월 19 04:02 access_log.7
-rw——- 1 root root 0 10월 12 04:02 access_log.8
-rw——- 1 root root 297 11월 27 04:02 error_log
-rw——- 1 root root 373 11월 27 04:02 error_log.1
-rw——- 1 root root 373 11월 26 04:02 error_log.2
-rw——- 1 root root 813 11월 23 04:02 error_log.3
-rw——- 1 root root 373 11월 16 04:02 error_log.4
-rw——- 1 root root 1343 11월 9 04:02 error_log.5
-rw——- 1 root root 853 11월 2 04:02 error_log.6
-rw——- 1 root root 276555 10월 26 04:02 error_log.7
-rw——- 1 root root 373 10월 19 04:02 error_log.8

 

 

 

로그 로테이트 주기는 사이트 접속 빈도에 따라 하루 또는 주 단위로 설정하면 됩니다.

로그 로테이트 설정 후 syslog 데몬을 재시작해줍니다.

# /etc/init.d/syslog restart

 

[polldaddy rating=”7739789″] 

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x