Server & OS

아파치로그분석툴(Webalizer, cronolog)

페이지 정보

본문

아파치로그분석툴(Webalizer, cronolog)

 
t.gif
t.gif

설치가 그리 어렵지 않아서(--;) 문서를 만들지 않았는데 설치/설정에 대한 문의가 가끔 있어서 다시 정리한다.
이미 아파치로그 lotate(http://www.dbakorea.pe.kr/linux/apache_log_rotate.html)에 내용이 있긴하지만..

이 놈은 한글로 하자면 아파치로그분석기라고 칭하면 되겠다.
아파치라는 웹서버가 유명하고, 로그분석이 고객의 유형을 파악하는데 중요하므로
이런 로그분석툴들은 상당히 많다. 개인적으로는 이 놈이 가장 괜찮은 것 같다.
왜냐? 일단 스크립트(펄, ..)를 이용하는 다른 놈들보다 속도가 무쟈게 빠르다.
이거 서버 운영시 무지하게 중요한 부분이다. 로그분석하려고 몇시간 걸리고 이로인해
서비스상에 문제가 있다면 돌아오는 것은 관리자의 무능함...--;


<B>특징</B>
C언어로 만들어져 빠르다(200Mhz펜티엄에서 초당 10000레코드 처리)
common, combined 로그 포맷지원(combined를 사용하면 로그파일크기가 커지지만, 자세한 정보를 얻을 수 있다)
설정파일이나 커맨드라인을 이용하여 리포트를 커스터마이징 가능
한국어 지원
로그파일 크기제한 없고 부분적인 로그(일별,주별,월별..) 지원
소스 공개되어 있음


<B>설치</B>
2002년 4월 2일 현재 최신버전은 2.01-09이다.
ftp://ftp.mrunix.net/pub/webalizer/webalizer-2.01-09-src.tgz

root가 아니어도 설치할 수 있으나, 관리상 여기서는 그냥 root로 설치하자.
configure시의 언어지정은 소스를 푼 하위디렉토리 lang에서 알 수 있다.
아래에서는 -with-preifx옵션을 사용하지 않았으므로 /usr/local이 디폴트값을 갖는다.

[pre-require]
GD graphics library by Tom Boutell(http://www.boutell.com/gd/)

[root@ns /tmp]# tar xvzf webalizer-2.01-09-src.tgz -C /usr/local/src
[root@ns /tmp]# cd /usr/local/src/webalizer-2.01-09/
[root@ns webalizer-2.01-09]# ./configure -with-language=korean
[root@ns webalizer-2.01-09]# make
[root@ns webalizer-2.01-09]# make install


<B>설정</B>
/etc/webalizer.conf.sample로 설정예제 파일이 생긴다.
이를 /vhost/www/webalizer/webalizer.conf로 복사하여 설정하자.
이 작업은 일반유저인 dbakorea로 작업한다.

[dbakorea@ns www]$ cp /etc/webalizer.conf.sample webalizer/webalizer.conf

webalizer.conf에서 다음부분을 수정한다.
아파치로그는 combined 형태를 사용할 것이다.
로그파일은 cronolog를 이용하여 한달 간격으로 생성하게 할 것이므로 LogFile설정은 하지 않겠다.
그렇지 않은 사람은 다음과 같은 식으로 설정하면 된다.

LogFile        /usr/local/apache/logs/access_log

[webalizer.conf]
OutputDir      /vhost/www/webalizer/output
HistoryName     webalizer.hist
HostName       www.dbakorea.pe.kr
PageType        htm*
PageType        cgi
PageType        php

설정파일에 주석이 달려있으므로 나머지 부분은 필요시 설정하기를 바란다.
실제 설정이 제대로 되었는지 쉘상에서 확인해 보자
아래와 같이 테스트해본다. 아파치로그파일은 /usr/local/apache/logs/dbakorea-access_200204이다.

[dbakorea@ns webalizer]$ /usr/local/bin/webalizer -c /vhost/www/webalizer/webalizer.conf \
> /usr/local/apache/logs/dbakorea-access_200204
Webalizer V2.01-09 (Linux 2.4.18) Korean
대상 로그 파일: /usr/local/apache/logs/dbakorea-access_200204 (clf)
출력 디렉토리: /vhost/www/webalizer/output
호스트명: 'www.dbakorea.pe.kr'
기존 히스토리 정보 해석: webalizer.hist
리포트 생성: April 2002
리포트 출력
히스토리 정보 저장
5782 레코드 동작시간 0.57 초

이제 모든 것이 제대로 돌아가므로 이를 crontab에 등록하여 하루에 한번씩 실행되도록 하자.
우선 아래와 같이 run_cron.sh라는 파일을 만든다.
crontab의 등록은 그냥 쉘상에서 crontab을 실행하면 에디터가 실행되는데
58 23 * * * /vhost/www/bin/run_cron.sh
와 같이 입력하고 저장하고 빠져나오면(:wq로 vi와 같다. 사실 편집기로 vi가 실행되는 것이다.) 된다.

[dbakorea@ns webalizer]$ cat /vhost/www/bin/run_cron.sh
#!/bin/sh
/usr/local/bin/webalizer -c /vhost/www/webalizer/webalizer.conf \
/usr/local/apache/logs/dbakorea-access_`date +%Y%m`

[dbakorea@ns webalizer]$ crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.14382 installed on Tue Apr  2 23:36:29 2002)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
58 23 * * * /vhost/www/bin/run_cron.sh


<B>[아파치 로그파일]</B>
나는 cronolog라는 프로그램으로 한달치마다 로그파일을 분리하여 생성했다.
이제 cronolog설치와 설정을 보자. 사실 너무 간단하다.

http://www.cronolog.org에 가서 프로그램을 받아오자
현재 최신버전은 1.6.2이다.

[root@ns /tmp]# tar xvzf cronolog-1.6.2.tar.gz -C /usr/local/src
[root@ns cronolog-1.6.2]# ./configure
[root@ns cronolog-1.6.2]# make
[root@ns cronolog-1.6.2]# make install

이제 httpd.conf에 다음과 같이 CustomLog에 설정해주면 된다.

<VirtualHost *>
     ServerAdmin         kang@dbakorea.pe.kr
     DocumentRoot        /vhost/www
     ServerName          www.dbakorea.pe.kr
     ServerAlias        dbakorea.pe.kr
     ErrorLog            /usr/local/apache/logs/dbakorea-error
     CustomLog           "|/usr/local/sbin/cronolog /usr/local/apache/logs/dbakorea-access_%Y%m"
     ErrorDocument      404             /vhost/www/error.html
</VirtualHost>

This article comes from dbakorea.pe.kr (Leave this line as is)
 
-----------------------------------------------------------
 
 
 
 
아파치 로그(Apache Log) 관리법 -- rotatelog, cronlog
 
 
접속자가 많은 사이트에서는 아파치 로그를 관리하는 것도 만만치 않다.
Linux, solaris 등에서 로그 파일 크기가 2GB가 넘어서 골치아픈 경우도 발생한다.
또한 로그 파일이 크면 클수록 서버에 필요없는 무리를 주는 것도 사실이다.


1) Apache 자체에서 제공하는 rotatelogs를 이용하여 로그를 시간과 용량에 따라
  분리 저장하는 방법
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

내용출처 : http://www.nehome.net/
이 글은 "재밌는 자료 모아모아~ 카페의 리눅스"에서 작성된 글입니다. >> 원문보기
 
 
 
 

관련자료

등록된 댓글이 없습니다.
Today's proverb
남보다 앞서는 사람은 자격증이 있는 사람이 아니라 관심이 있는 사람이다.