본문으로 바로가기

Apache에서 기본적으로 사용하는 로그관리는 logrotate입니다. 이것은 로그 순환을 위해서 실행중인 웹서버를 잠시 중단해야 하는 불편함과 날짜별 세분화된 로그순환이 어렵기에 대체방안을 생각해봅니다.

로그를 파이프로 보내기

Apache 웹서버는 오류 로그와 접근 로그를 파일에 직접 쓰지않고 파이프를 통해 다른 프로세스로 보낼 수 있다. 이 기능을 사용하면 서버에 코드를 추가하지않고도 매우 유연하게 로그를 처리할 수 있다.

로그를 파이프에 쓰기위해 파일명 자리에 파이프문자 |와 뒤에 표준입력으로 로그 항목을 읽을 실행파일명을 적으면 된다.

Apache는 서버가 시작할때 파이프로 연결할 로그 프로세스를 시작하고, 서버가 실행되는 동안 프로세스가 죽으면 다시 시작한다(이 마지막 기능때문에 우리는 이 방법을 "믿을 수 있는 파이프 로그"라고 부른다).

파이프로 연결된 로그 프로세스는 부모 Apache httpd 프로세스가 띄우고, 프로세스의 userid도 같다. 즉, 파이프로 연결된 로그 프로그램은 보통 root로 실행된다. 그러므로 프로그램을 간단하고 안전하게 만드는 것이 매우 중요하다.

파이프로 부르는 전체 명령어를 따옴표로 묶음을 명심하라. 이 예는 접근 로그에 대한 것이지만, 오류 로그도 마찬가지다.

서버를 재시작하지않고 로그를 순환할 수 있는 것이 파이프 로그를 사용하는 중요한 이유다.

Apache 웹서버는 이를 위해 rotatelogs라는 간단한 프로그램을 포함한다. 예를 들어 24시간마다 로그를 순환한다면:

CustomLog "|/usr/sbin/rotatelogs /var/log/apache2/access.log 86400" common

명령어의 위치는 which를 사용하여 확인할 수 있다.

which rotatelogs

자신의 명령어 위치를 유념하여 작성한다.

아파치로그 : http://httpd.apache.org/docs/2.0/ko/logs.html

rotatelogs

rotatelogs는 Apache를 설치하면 자동으로 함께 설치가 된다. 이 예제는 우분투에서 apt-get으로 설치된 apache2를 기준으로 설명한다.

특정시간 간격으로 로그 저장(초단위, 86400=24시간)

CustomLog "|/usr/sbin/rotatelogs /var/log/apache2/access.log 86400" combined

로그파일명은 access.log.xxxxx와 같고 xxxxx는 로그파일 생성시의 timestamp이다.

기본적인 timestamp 형식은 이해하기 힘드므로 년월일-시분초 형식으로 아래와 같이 변경한다.

CustomLog "|/usr/sbin/rotatelogs /var/log/apache2/access.log.%Y%m%d-%H%M%S 86400" combined

파일의 크기를 기준으로 로테이트 시킬 수 도 있다.

CustomLog "|/usr/sbin/rotatelogs /var/log/apache2/access.log.%Y%m%d-%H%M%S 100M" combined

기본 access_log.%Y%m%d 86400 설정시 매일 24시에 새로 생성되지 않고 오전 9시경에 분할이 되는데, GMT 기준 우리나라가 9시간 빨라서 발생하는 현상이다.

밤 12시에 rotat를 실행하기 위해서는 GMT + 9(9 * 60 = 540분)시간을 더해준다.

예) "access_log.%Y%m%d 86400 +540"

지시어 내용
%A (지역화된) 완전한 요일 이름
%a (지역화된) 3-문자 요일 이름
%B (지역화된) 완전한 달 이름
%b (지역화된) 3-문자 달 이름
%c (지역화된) 날짜와 시간
%d 2-자리 일
%H " 2-자리 시간(24시간 시계)
%I(대문자 i) 2-자리 시간(12시간 시계)
%j 3-자리 날짜수
%M 2-자리 분
%m 2-자리 달
%p (지역화된) 12시간 시계의 am/pm
%S 2-자리 초
%U 2-자리 주일수(주의 첫번째 날은 일요일)
%W 2-자리 주일수(주의 첫번째 날은 월요일)
%w 1-자리 요일수(주의 첫번째 날은 일요일)
%X (지역화된) 시간
%x (지역화된) 날짜
%Y 4-자리 연도
%y 2-자리 연도
%Z 시간대 이름
%% 문자그대로 `%'

다음오픈지식 : http://k.daum.net/qna/openknowledge/view.html?qid=0sk2v

cronolog

cronolog는 날짜별, 디렉토리별, 심볼릭링크등을 사용할 수 있게 개선된 로그관리 프로그램이다.

우분투의 경우 아래와 같이 설치한다.

sudo apt-get install cronolog

년월 단위로 로테이션하기

CustomLog "|/usr/bin/cronolog /var/log/apache2/access.log.%Y%m" combined

결과)

/var/log/apache2/access.log.201307
/var/log/apache2/access.log.201308

년월에 따라 다른 디렉토리에 로그를 나누기

CustomLog "|/usr/bin/cronolog /var/log/apache2/%Y/%m/access.log.%Y%m%d" combined

결과)

/var/log/apache2/2013/07/access.log.201307.01
/var/log/apache2/2013/07/access.log.201307.02
...
/var/log/apache2/2013/08/access.log.201308.01

로그파일을 access.log로 심볼릭 링크하기

CustomLog "|/usr/bin/cronolog --symlink=/var/log/apache2/access.log 
/var/log/apache2/%Y/%m/access.log.%Y%m" combined

결과

/var/log/apache2/access.log -> /var/log/apache2/access.log.201308
/var/log/apache2/access.log.201307
/var/log/apache2/access.log.201308

기타 로그관리 팁

SetEnvIf를 이용하여 이미지파일의 로그를 남기지 않기

우분투에서 기본적으로 SetEnvIf 활성화되어 있다.

SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(ico)$" dontlog
CustomLog /var/log/apache2/access.log combined env=!dontlog

지난 로그를 자동으로 압축하기

파일을 압축하는 스크립트를 cron에 등록시켜 사용하면 된다.

find /var/log/apache2 -name *.log -mtime +1 -exec gzip {} \;