본문 바로가기
APM

보다 자유로운 아파치 로그 관리를 위해

by 누피짱 2008. 4. 25.
/usr/local/apache/logs/abc-access_log {
        daily
        rotate 4
        compress
        create 0644 root root
        postrotate
        /usr/local/apache/bin/apachectl graceful> /dev/null 2>&1
        # /bin/kill -HUP 'cat /usr/local/apache/logs/httpd.pid 2>/dev/null' 2> /dev/null || true
        endscript
}

logrotate 설정

/etc/logrotate.d/aaa

daily
rotate 4

/usr/local/apache/logs/aaa_access_log {
        postrotate
           /bin/kill -HUP `cat /usr/local/apache/logs/httpd.pid 2>/dev/null` 2> /dev/null || true
        endscript
}

도메인을 여러개 서비스를 할경우..
여기서 bbb_access_log 파일도 있을경우 어떻게 셋팅해야 하나요?
다시 /etc/logrotate.d/bbb 를 만들어야 하는지..
아님 /etc/logrotate.d/aaa 에 추가해도 되는지...

/usr/local/apache/logs/*_access_log  



보다 자유로운 Apache Log 관리를 위해





어떻게 보면 로그란 것이 작은 사이트에서는 별 거 아니지만,

하루에 수십~수백 MB 씩 로그가 쌓이는 사이트에서는

로그 관리 하나가 그렇게 힘들 수가 없습니다. 6-.-;

수백 MB 짜리 로그 파일을 열고 있는 것만으로도 시스템이 벅차죠.

그래서 어떤 때는 아예 로그를 남기지 않도록 해 버렸던 적도 있는데... ;;;

지금은 아래와 같은 방법으로 아파치 로그 관리를 합니다.

별로 쓰시는 분이 없는 건지

적수네 동네나 kldp 등을 찾아봐도

검색해서 나오는 글이 하나도 없길래 제가 하나 올려 봅니다. ^_^


1. /etc/logrotate.d/httpd

뭐 스크립트 하나 짜서 크론에 넣고 돌리는 것도 괜찮겠습니다만,

썩 괜찮은 로그로테이트가 이미 있는데 굳이 새로 짤 거 없어서

그냥 이렇게 돌립니다. 지금도 작은 버추얼 호스트는 이걸 씁니다. ^_^

//-------------------------------------- httpd.conf
<VirtualHost *>
...
ErrorLog /var/log/httpd/error
CustomLog /var/log/httpd/access combined
</VirtualHost>


//-------------------------------------- /etc/logrotate.d/httpd
/var/log/httpd/access {
size 5000k // 파일 하나당 5000k
rotate 10 // 10개 순환
missingok // 해당 파일이 없어도 에러를 내지 않음
notifempty // 비어 있을 경우 순환시키지 않음
create 0660 apache apache // 새로 만듦
postrotate // 순환 작업 후 서버 재 가동
/usr/local/apache/bin/apachectl graceful
endscript
}

아시는 분은 아시겠지만, 로그 파일을 옮기고

같은 이름의 파일을 새로 만든다고 해도 로그는 이전 파일에 계속 남습니다.

아파치가 파일을 연채 잡고 있기 때문인데...

서버를 재시작해 주지 않는 이상 어쩔 수가 없습니다. ;;;

그래서 위에 /usr/local/apache/bin/apachectl graceful 를 넣어주는 거죠.

그리고 서버를 재시작해도 일정 시간 동안은 잡고 있고요.

바로 이 부분이 마음에 들지 않았는데,

하루에 수십 MB 의 로그가 쌓이는데, 참 갑갑하죠.

서버의 자원을 아끼기 위하여 작은 파일을 유지하고 싶은데,

(큰 로그 파일을 여는데 엄청 버벅거리거든요...)

하루에 한번씩 서버를 재시작해 주기도 그렇고... 쩝


2. piped logs

piped logs 를 이용해 해결을 했습니다.

CustomLog "| /usr/local/apache/bin/rotatelogs /var/log/httpd/access 86400" combined

애초부터 직접 파일에 기록하지 않을 수 있으니,

파일을 마음껏 돌릴 수 있게 된 거죠.

access.993434333

이런 파일이 86400 초마다 새로 생겨납니다.

일정 프로그램으로 로그 출력을 돌려서

실시간 로그 분석기도 만들 수 있을테고...

압축해서 저장할 수 있을테고... 아무튼...

재미있는 것은 아파치가 가동될 때 같이 뜨는데

죽이더라도 다시 살아난다는 겁니다. ^^

유의하실 점은 이게 아파치 시작시 root 로 같이 뜨는 거라서

로그 파일도 root 로 만들어진다는 겁니다. 모드는 0644 였던 듯...

(저도 테스트만 해 봐서...)


3. cronolog

http://www.ford-mason.co.uk/resources/cronolog/

rotatelogs 는 초단위 밖에 지원을 안 해 주지만,

cronolog 를 통해 각 시간 단위 별로 자유롭게 사용할 수가 있습니다.

즉, 년/월/일/주/시/분/초 등등 다양한 형태의 조합이 가능하다는 거죠.

(개인적으로 가장 마음에 드는 것은 %U : 1~53주 ^^)

[ 소스 설치 ]

내려 받기 해서

$ tarx cronolog-1.6.1.tar.gz

$ ./configure

$ make

$ make install

하면 끝입니다.

configure 시 옵션은 파일/디렉 생성 빼고는 별로 신경 쓸 거 없더군요.

-DFILE_MODE=octal-number        //mode used for creating files (default is 0664)

-DDIR_MODE=octal-number         //mode used for creating directories (default is 0775)

전 0660 && 0770 으로 주었는데 어째 잘 안 되는 듯... ;;;

윈도우즈용도 있는데, 그냥 받아다가 원하는 곳에 복사해 넣으면 끝.


아무튼 --PREFIX 주지 않고 생성하면 기본으로 설치되는 곳은

/usr/local/sbin , /usr/local/man 입니다.

INSTALL 문서에는 /usr/local/bin 으로 되어 있지만,

제작자의 실수인 것으로 보입니다. :)

이제 로그 지시자를 다음과 같이 바꾸세요.

CustomLog "| /usr/local/sbin/cronolog /var/log/httpd/access_%Y%m%d" combined

혹은

CustomLog "| /usr/local/sbin/cronolog /var/log/httpd/%Y/%m/%d_access" combined

그리고 아파치를 graceful 하게 재시작하면

/usr/local/sbin/cronolog /var/log/httpd/access_%Y%m%d 이 아파치와 함께 뿅~ 뜹니다.

이제부터 하루 기준으로 로그가 기록됩니다. ^_^

디렉토리도 자동 생성되고요...

README 에 보면 다양한 지시자가 있습니다.


용량은 당연히 무척 작아서 120KB 든가 되고...

이것 역시 rotatelogs 와 마찬가지로 죽여보면 다시 뜹니다. ^_^

그런데 아쉽게도 ErrorLog 는 죽이면 다시 살아나지 않더군요. ;;;

물론 graceful 로 아파치를 살짝 띄우면 다시 살아나고요.

뭐 아무렴 하루에 한번씩 다시 띄우는 것만 못 하겠습니까. 6^ ^;;;

옛날 파일까지 너무 오래 쌓이면 용량 부족해지니까

댓글