(안정철 님에게 책 내용에 대해 발췌하는 것에 대해서 허락을 구하지 못하였습니다. 삭제를 요구하시면 바로 삭제 조취 하겠습니다.)
Session 03. 에러 로그 분석 방법
웹 서버가 어떻게 사용되고, 혹 잘못된 부분이 없는지를 분석할 때에 유용하게 사용될 수 있는 것 중의 하나가 에러 로그 파일이다. "에러 로그"는 웹 서버가 운영 중에 발생되는 잚소된 모든 기록을 포함하고 있다. 웹 서버의 시작이나 중지와 같은 통보정도에 지나치지 않는 일반 메세지까지 말이다. 에러 로그 파일은 'ErrorLog' 지시어를 이용하여 어느 곳에 기록할 지를 지정하며, 기본으로 설정되는 로그 파일의 경로는 "/usr/local/apache/logs/error_log"가 된다. 에러 로그의 기록을 원하지 않는 경우에는 다음과 같이 "null" 디바이스로 전송하면 된다.
ErrorLog /dev/null
이러한 방법은 웹 서버가 디스크에 엑세스하는 시간을 줄여, 실제로 아파치가 로그를 기록하는데 소비하는 시간을 감소시켜 준다. 이외에 유닉스 시스템 로그 데몬에 에러 메세지를 전송 하는 것도 가능하다. 이것은 한 호스트에 하나의 에러 로그만이 가능하며, 만약 여러 개의 ErrorLog를 지정하게 되면 마지막에 지정된 것이 사용될 것이다. 아파치의 에러 로그는 유닉스 시스템에서 사용하는 것과 같이 제일 하단의 'debug'에서부터 'emergency'까지의 전체 8개의 범위를 가지고 있다.
일반적으로 로그의 모든 메세지들을 에러 로그 파일에 기록하는 것은 디스크의 소모뿐만 아니라 로그를 기록하기 위한 프로세스 시간을 필요로 하게 된다. 이러한 부분들을 고려하여 아파치 웹 서버는 'LogLevel' 지시어를 이용한 각 로그 레벨 단위의 기록이 가능하도록 하고 있다. 예를 들어, 'notice' 또는 그 이상의 범위에 해당하는 내용만 기록에 남기고자 한다면 아래와 같이 입력할 수 있다.
LogLevel notice
이와 달리, 'debug' 레벨을 선택하게 되면 아파치에서 발생하는 모든 에러 메세지를 로그에 기록하게 되므로 자원의 공간과 프로세스 시간을 낭비하는 결과를 초래하게 된다. 물론 이와 같이 모든 내용을 기록한다는 것이 여러분들에게 어떠한 생각을 줄여 줄지는 모르지만, 'debug'와 같이 모든 내용을 기록한다는 것이 에러 로그에 있어서는 그리 비효율적이라 생각은 들지 않는다. 로그의 범위는 여러분들의 고민으로 남겨 두도록 하겠다.
다음 표는 각 단계별 로그 레벨의 의미를 나타낸 것이다.
| 로그 레벨 | 에러의 이미 |
|---|---|
| emerg | 불안정한 시스템 상황 |
| alert | 즉각적인 조치 필요 |
| crit | 중대한 에러 |
| error | 비교적 중대하지 않은 에러 |
| warn | 경고 |
| notice | 중대한 것은 아닌 일반적인 메세지 |
| info | 정보 |
| debug | 디버그 레벨 |
아파치의 에러를 시스템 로그 데몬인 'syslogd'를 전송하기 위해서는 다음과 같이 기존의 에러 로그 파일의 이름을 'syslog'로 변경하여야 한다.
ErrorLog syslog
기본적으로 에러 로그는 syslog에 'local7'의 이름으로 기록이 되며, syslog.conf에서 syslogd 데몬은 어떠한 에러 메세지들을 받을 것이지 제어하게 된다. syslog.conf에 다음의 라인을 포함하게 되면 /var/log/httpd.log에 내용을 저장하게 된다.
Local7.* /var/log/httpd.log
이외에 local7.* 과는 달리 앞쪽에서 언급하였던 로그 레벨을 기반으로 로그를 따로 저장 할 수가 있다. 아래의 예은 warn 로그 레벨 이상의 정보를 /var/log/httpd_warn.log 에 저장하는 것과 info 레벨 또는 그 이상의 메세지를 error 레벨 이하로 기준하여 /var/log/httpd_info.log 에 저장하게 된다. 쉽게 이야기하면 httpd_info.log는 info,notice,warn 레벨을 포함하는 것이다.
Local7.warn /var/log/httpd_warn.log
Local7.info;local7.!=error /var/log/httpd_info.log
Local7.info;local7.!=error /var/log/httpd_info.log
웹 서버의 문제 해결은 에러 로그와 함께 아파치를 처음 접하는 초보자가 설치 후 애기치 못한 문제에 봉착하였을 경우에는 당황하지 말고 에러 로그를 찾아봄으로써 문제의 대부분을 해결할 수 있다.
웹 서버에 문제가 있을 때에는 발생되는 문제를 즉시 확인하기 위하여 계속적으로 로그 파일을 확인해 보아야 하는 경우도 있기 마련이다. 이럴 때에는 유닉스에서 제공해 주는 'tail' 명령어를 이용하여 다음과 같이 사용하면 된다.
tail -f /usr/local/apache/logs/error_log
또 다른 방법으로는 펄을 이용할 수가 있다. File::Tail 모듈을 사용하면 되고 이것을 통하여 여러분들이 다양하게 응용하여 사용해 볼 수 있으며, http://www.cpan.org/modules/by-module/File/File-Tail-0.98.tar.gz에서 구할 수 있다.
use File::Tail;
$file=File::Tail->new("/var/log/file");
while (defined($line=$file->read)) {
print "$line";
}
$file=File::Tail->new("/var/log/file");
while (defined($line=$file->read)) {
print "$line";
}
"tail -f" 를 이용한 로그 파일을 살펴보면 이래와 같은 내용을 확인할 수 있다.
[Test: /]tail -F access_log
192.168.0.24 - - [2/Mar/2004 : 18:29:14 +0900] "Get /images/board.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:14 +0900] "Get /images/left.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:14 +0900] "Get /images/ground.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:14 +0900] "Get /images/test.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:14 +0900] "Get /images/user_name.html HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:32 +0900] "Get /images/images1.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:33 +0900] "Get /images/images2.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:33 +0900] "Get /images/test2.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:42 +0900] "Get /images/test3.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:42 +0900] "Get /images/test4.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:42 +0900] "Get /images/logo.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:14 +0900] "Get /images/board.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:14 +0900] "Get /images/left.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:14 +0900] "Get /images/ground.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:14 +0900] "Get /images/test.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:14 +0900] "Get /images/user_name.html HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:32 +0900] "Get /images/images1.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:33 +0900] "Get /images/images2.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:33 +0900] "Get /images/test2.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:42 +0900] "Get /images/test3.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:42 +0900] "Get /images/test4.jpg HTTP/1.1" 200 36
192.168.0.24 - - [2/Mar/2004 : 18:29:42 +0900] "Get /images/logo.jpg HTTP/1.1" 200 36
지금까지 아파치 서버의 대표적인 Access_log와 error_log의 분석 방법에 대하여 알아보았다. 아파치 서버는 오늘날 운영중인 웹 서버중 운영 빈도가 높은 서버중 하나이다.
아파치 서버에 저장된 로그 파일로부터 유용한 정보를 얻어내기 위해서는
- 사용자 스스로 로그 파일에서 필요한 정보만을 추출하는 방법
- 자동화된 로그 분석 프로그램을 이용하는 방법
위 2가지 방법으로 나눌 수 있다. 대부분의 경우에는 수작업에 기록된 내용을 분석하고 통계를 알아내는 방법보다는 분석 프로그램을 이용하여 다양한 정리된 자료를 원할 것이다. 그러나 경영자 입장에서 웹 로그로부터 얻을 수 있는 가장 중요한 정보중 하나는 히트(hit)와 페이지뷰(pageview)이다. 히트는 웹 서버에서 받은 모든 요청과도 같다. 페이지 상에 포함된 이미지, 사운드 파일, 그리고 기타 모든 것들이 하나의 히트로 간주되며, 이와 달리 페이지뷰는 좀 더 정확하게 전체의 각 부분이 아니라 페이지 전체를 하나로 본 것이라 이해하면 된다.
이 히트와 페이지뷰를 통하여 누가 사이트를 방문하였고, 방문한 사용자들은 어디로부터 왔으며, 어떠한 페이지를 보았고, 또 얼마나 오랫동안 머물렀는지, 그리고 사용한 브라우저는 무엇인지 등 다양한 정보를 방문객으로부터 얻어낼 수가 있다.
이러한 정보를 다양하게 분석하려면 분석 툴 보다는 수작업에 의한 것이 더 다양한 정보를 획득할 수 있다는 점을 잊지 말기 바란다. 그러나 로그 분석 툴이 사람의 수작업을 통한 것보다 좀 더 정확하고 신속한 장점도 있음을 알아두자.
아무리 웹 서버의 로그를 잘 분석하고 적절히 조치할 수 있다하더라도 서버 관리자에 의한 환경 설정에 따라 외부로부터의 공격 가능성과 웹 서버 자체 또는 사용하는 어플리케이션 프로그램의 버그로 인한 공격에는 늘 노출되어 있음을 인식하자. 특히 요즘 사회이슈로 자주 등장하는 인터넷 웜의 경우 각 서버에 공통적인 취약점을 찾아서 공격하므로 웹 서버의 경우는 로그 분석만이 아니라 보안 패치가 수시로 이루어져야 한다.
아파치의 경우 공개 소프트웨어이면서 많이 운영되다 보니 시스템 자체의 취약점이 자주 발견되고 즉시 패치자료가 공개되고 있다. 따라서 아래의 사이트에서 수시로 패치자료를 다운받아 설치해두는 점이 좀더 안정적인 시스템 운영에 도움이 되리라 생각한다.











::: 사람과 사람의 교감! 人터넷의 첫 시작! 댓글을 달아주세요! :::