분리 저장하는 방법
2) 보다 개선된 형태의 cronolog로 로그를 rotation하는 방법
3) images 로그와 윈도 OS 관련된 warm 로그를 별도로 저장하는 방법을 소개한다.
------------------------------------------------------------------------
1) weblog를 자동 rotation하기
로그를 관리하기 위해 logrotate 를 사용하는 경우가 많지만, 이는 서비스를 일시 중단해야
한다. 그러나 apache에서 제공하는 rotatelogs는 웹서버 동작중에 (1) 특정시간간격이나
(2) 특정 크기 단위로 로그를 저장한다.
예) CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/access.log 86400" common
위는 웹서버를 실행한지 86400초(24시간)간격으로 로그파일을 나눠서 저장한다.
로그 파일명은 'access.log.????' 형식으로 ???? 는 로그파일 생성시의 timestamp 이다.
즉, access.log.1060189068, access.log.1060120280 형태로 파일명이 만들어진다.
이런형태의 파일명이라면 이해하기 힘들 것이다. 좀더 쉽게 파일명을 만들어보자.
CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/access_log.%m%d-%H%M%S 86400" common
또는
CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/access_log.%m%d 86400" common
이제는 'access_log.월일-시분초' 또는 'access_log.월일' 형태로 생성될 것이다.
CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/access_log.%m%d-%H%M%S 100M" common
100M 단위로 로그를 저장할 수도 있다.
2) cronolog 툴로 개선된 형태로 log rotation하기
cronolog는 년월일에 따라 다른 디렉토리에 로그를 남길 수도 있다.
또한 webalizer 같은 웹로그 분석툴은 access_log 와 같이 지정한 파일을 분석하는데,
access_log.년월일' 처럼 로그 파일이 매번 바뀐다면 로그파일 지정하는게 쉽지않다.
cronolog 는 심볼릭 링크를 통해 이를 쉽게 해결해주고 있다.
http://www.cronolog.org/ 에서 cronolog-x.y.z.tar.gz 을 받아
./configure
make
make install
을 한다.
사용은 rotatelogs와 비슷하다.
(1) 년월 단위로 로테이션한다.
CustomLog "|/usr/local/sbin/cronolog /usr/local/apache/logs/access_log.%Y%m" common
년월로 나눠서 'access_log.년월'형식으로 저장을 한다.
/usr/local/apache/logs/access_log.200307
/usr/local/apache/logs/access_log.200308
(2) 다음과 같이 년월에 따라 다른 디렉토리에 로그를 나눌 수도 있다.
CustomLog "|/usr/local/sbin/cronolog /usr/local/apache/logs/%Y/%m/access_log.%Y%m%d" common
/usr/local/apache/logs/2003/07/access_log.20030701
/usr/local/apache/logs/2003/07/access_log.20030702
/usr/local/apache/logs/2003/07/access_log.20030703
...
/usr/local/apache/logs/2003/08/access_log.20030801
(3) 로그파일을 access_log로 심볼릭 링크해보자
CustomLog "|/usr/local/sbin/cronolog --symlink=/usr/local/apache/logs/access_log
/usr/local/apache/logs/access_log.%Y%m" common
/usr/local/apache/logs/access_log -> /usr/local/apache/logs/access_log.200308
/usr/local/apache/logs/access_log.200307
/usr/local/apache/logs/access_log.200308
3) images 로그와 warm 로그는 별도로 저장
웹서버 튜닝 중에 이미지 파일만 별도의 웹서버로 분리하는 방법이 있다.
이 방법은 Request와 I/O 출력, 트래픽을 분산하는 효과가 있을 것이다.
이런 튜닝 방법과는 다르지만 images 로그만 별개로 파일로 저장하는 방법을 소개한다.
다음은 이미지 파일은 images_log에, Codered나 Nimda 등의 warm은 warm_log 에 저장하는 설정이다.
---------------------------------
SetEnvIf Request_URI ".gif$" except=images
SetEnvIf Request_URI ".jpe?g$" except=images
SetEnvIf Request_URI ".png$" except=images
SetEnvIf Request_URI "^/default.ida" except=warm # Codered
SetEnvIf Request_URI "/root.exe?" except=warm # Nimda
SetEnvIf Request_URI "/cmd.exe?" except=warm
SetEnvIf Request_URI "^/NULL.printer" except=warm #
SetEnvIf Request_URI "^/NULL.IDA?" except=warm
SetEnvIf Request_URI "^/NULL.ida?" except=warm
SetEnvIf Request_URI "^/NULL.idq?" except=warm
SetEnvIf except images images
SetEnvIf except warm warm
CustomLog logs/access_log common env=!except
CustomLog logs/images_log common env=images
CustomLog logs/warm_log common env=warm
---------------------------------
URI 중에 .gif, .jpg, .jpeg, .png 로 끝나는 것은 except 변수에 images값으로 정의하고,
/default.ida, /root.exe?, /cmd.exe?, /NULL.printer, /NULL.IDA?, /NULL.ida? /NULL.idq?
등은 윈도의 IIS의 취약점을 이용한 웜 공격으로 except 변수에 warm 값으로 정의한다.
그리고 또한번 변수 except의 값이 images 인 것은 변수 images로 정의
변수 except의 값이 images 인 것은 변수 warm으로 정의
CustomLog 설정을 보면
env=!except 에 의해 image와 warm로그(except변수로 정의)를 제외한(=!) 것만 access_log
에 저장하게 된다.
마찬가지로 env=images, env=warm에 따라 각각 images_log, warm_log에 저장하게 된다.
cronolog 와 함께 쓸 때는 다음과 같이
CustomLog "|/usr/local/sbin/cronolog --symlink=/usr/local/apache/logs/access_log
/usr/local/apache/logs/access_log.%Y%m" common env=!except
CustomLog "|/usr/local/sbin/cronolog /usr/local/apache/logs/images_log.%Y%m" common env=images
CustomLog "|/usr/local/sbin/cronolog /usr/local/apache/logs/warm_log.%Y%m" common env=warm