Apache log iconApache 서버를 운영하다 보면 조만간 log 파일들(access_log과 error_log)이 너무 비대해 지거나, 필요도 없는 오래된 정보로 인해 재설정을 해줘야 할 때가 옵니다.
일반적으로, access.log는 매 10,000 요청마다 1Mb 정도로 커지는 데, 대부분의 사용자들은 log 파일을 새 것으로 대체할 목적으로 log 파일을 옮기거나 지우기만 하면 그만이라고 생각하지만, 이것은 올바른 조치가 아닙니다.
왜냐하면, 이렇게 해도 Apache는 log 파일이 옮겨지기 전의 같은 offset에 계속 이어서 기록을 하게 되기 때문입니다. 이것은 이전 것과 같은 크기의 새로운 log 파일이 다시 생성되는 결과를 가져오며, 파일 안에는 수 천(혹은 수 만)의 빈 글자들로 채워지게 됩니다.

그래서, 올바르게 log 파일을 재설정하는 방법은 아래처럼, 우선 log 파일을 옮긴 후에, Apache에게 새로운 log 파일을 다시 열도록 지시합니다.

mv access_log access_log.old
mv error_log error_log.old
apachectl graceful
sleep 600
gzip access_log.old error_log.old

주의: 위에서는 restart 대신에 graceful 명령을 썼기 때문에, Apache가 clients와 접속을 끝낼 때 까지는 계속 이전 log 파일에 기록을 할 수 있도록 sleep 명령을 써서 약간의 시간만큼 기다리도록 해줘야 합니다.

log 파일들의 재설정 (그리고 저장)은 대게 매일 밤 혹은 주간으로 행해지는 것이 좋습니다만, Mac OS X에서는 crontab 작업들 중에 포함되어서(/etc/periodic/weekly/500.weekly) 자동적으로 수행됩니다.

다음은, Mac OS X의 주간 cron 작업에 포함된 Apache log 파일 순환(rotate) shell script:

cd /var/log/httpd
for i in access_log error_log; do
  if [ -f "${i}" ]; then
    printf %s " $i"
    if [ -x /usr/bin/gzip ]; then gzext=".gz"; else gzext=""; fi
    if [ -f "${i}.3${gzext}" ]; then mv -f "${i}.3${gzext}" "${i}.4${gzext}"; fi
    if [ -f "${i}.2${gzext}" ]; then mv -f "${i}.2${gzext}" "${i}.3${gzext}"; fi
    if [ -f "${i}.1${gzext}" ]; then mv -f "${i}.1${gzext}" "${i}.2${gzext}"; fi
    if [ -f "${i}.0${gzext}" ]; then mv -f "${i}.0${gzext}" "${i}.1${gzext}"; fi
    if [ -f "${i}" ]; then mv -f "${i}" "${i}.0" && if [ -x /usr/bin/gzip ]; then gzip -9 "${i}.0"; fi; fi
    touch "${i}" && chmod 640 "${i}" && chown root:admin "${i}"
  fi
done
if [ -f /var/run/httpd.pid ]; then /usr/sbin/apachectl restart; fi
echo ""

위에서 log 파일들이 저장되어 있는 디렉토리와 http daemon의 pid가 저장되어 있는 파일이 생성될 위치, 그리고 apachectl 명령의 설치 위치만 수정해 주면, 따로 설치한 Apache에도 적용될 수 있을 겁니다.

기타 log 관련 사용 예

localhost에서의 접속 내용을 log 파일에 기록하지 않음:

# Mark requests from the loop-back interface 
SetEnvIf Remote_Addr "192.168.0" dontlog
SetEnvIf Remote_Addr "127.0.0.1" dontlog

특정 요청 내용을 log 파일에 기록하지 않음:

# Mark requests for the robots.txt and the favicon.ico file 
SetEnvIf Request_URI "^/favicon.ico$" dontlog
SetEnvIf Request_URI "^/robots.txt$" dontlog
 
# Log what remains 
CustomLog logs/access_log combined env=!dontlog

그림 파일 요청 내용을 access log 파일에 기록하지 않음:

SetEnvIf Request_URI .gif image-request
SetEnvIf Request_URI .jpg image-request
SetEnvIf Request_URI .png image-request
CustomLog logs/access_log common env=!image-request

그림 파일의 “훔침” 방지:
다른 사람이 서버에 있는 그림을 자기들 페이지로 주소만 불러와서 사용하지 못하게 함.
(모든 그림 파일들이 /web/images/ 디렉토리에 있다고 가정)

SetEnvIf Referer "^http://www.example.com/" local_referal
# Allow browsers that do not send Referer info 
SetEnvIf Referer "^$" local_referal
<directory /web/images>
  Order Deny,Allow
  Deny from all
  Allow from env=local_referal
</directory>

더 자세하게 알아보기

관련된 주제의 글

“Apache의 log 파일과 환경 변수 설정”에 달린 한 개의 댓글

댓글을 남겨 주세요