목공책 하나 들이셔요~

2014년 1월 16일 목요일

오래된 로그 파일들을 자동으로 지우기

프로그래머... 특히 시스템 데몬을 주로 작성하는 프로그래머에게 로그(Log)는 매우 중요한 도구입니다. 로그를 보고 프로그램이 제대로 도는지 알 수 있고, 에러가 났다면 원인이 뭔지 파악할 수 있으며, 심지어 날짜별로 정리된 로그 파일을 이용하여 오래 전 발생한 문제에 대해서도 분석을 할 수 있습니다.

하지만 로그 파일이 계속 쌓여 가는데 이를 지우지 않으면 언젠가는 하드디스크가 꽉 차 버려서 문제가 발생할 수 있다는 겁니다. 제가 작성한 프로그램들은 매우 빈번한 I/O를 수행하기 때문에 하루에 쌓이는 로그 양만해도 거의 500 MB에 육박하기도 합니다. 그래서 오래된 로그 파일을 자동으로 지우는 방법이 필요했습니다.



find 툴 사용

제가 쓰고 있는 Linux 환경을 가정하고 방법을 찾아보니 여러가지가 있습니다만... 가장 간편하고 깔끔한 방법은 find 툴을 이용하는 거였습니다. find 명령은 원래 여러 조건으로 파일을 찾기 위한 것입니다. 하지만 여느 유닉스 툴과 마찬가지로 오랜 세월을 거쳐오면서 그 기능이 아주 다양해 졌습니다.

파일을 찾을 때 이름으로 검색할 수 있는 것 뿐 아니라 파일 생성시각이나 파일 수정시각을 기준으로도 검색을 할 수 있습니다. find의 기본 구문은 다음과 같습니다.

find [options] [path...] [expression]

가장 간단하게는 커맨드 라인에서 "find . " 이라고 치면 현재 디렉토리와 하위 디렉토리 전부를 뒤져서 파일들의 리스트를 출력해 줍니다.

find 명령의 마법은 [expression]에서 나옵니다. 이 expression에 다양한 조건을 설정하여 정밀하게 파일을 리스팅할 수 있습니다. 가장 쉽게 이름을 기준으로 찾는다면 -name 이라는 옵션을 사용하면 되고, 파일 수정날짜를 기준으로 한다면 -mtime 옵션을 사용하면 됩니다.

예를 들어 Tomcat의 로그가 쌓이는 /usr/local/apache-tomcat-7.0.34/logs 디렉토리에서 catalina로 시작하는 이름을 가지면서 7일이 경과된 파일들을 리스팅하려면 다음과 같이 입력하면 됩니다.

find   /usr/local/apache-tomcat-7.0.34/logs   -mtime  +7   -name  catalina\*

그러면 다음과 같이 결과가 나옵니다.


"catalina로 시작하는..."의 의미는 원래 쉘에서 사용하는 catalina* 를 쓰는 것이나 *문자가 커맨드 라인에서는 다르게 해석되므로 \ (back slash)를 이스케이프 문자로 사용하여 catalina\* 와 같이 씁니다.

mtime 옵션에서 +7과 같이 쓰면 수정날짜가 7일이 지난 파일들을 의미하며, -7로 쓰면 수정날짜가 7일 이내인 최신 파일들을 의미합니다.

이렇게 파일들을 리스팅했으면 이 파일들을 지우면 됩니다. 일반적으로 이렇게 표준 출력으로 파일이 나오면 파이프로 xargs 툴을 연결하여 이 파일들에 대한 동작을 할 수 있습니다. 예를 들어 위 파일들에 대한 wc (word count) 프로그램을 실행하려면 다음과 같이 하면 됩니다.

find   /usr/local/apache-tomcat-7.0.34/logs   -mtime  +7   -name  catalina\*  |  xargs wc 

하지만 find 명령의 expression에는 검색 조건만 넣을 수 있는게 아니라 검색된 결과에 대해 어떤 명령을 수행할 수 있는 방법도 제공합니다. 바로 -exec 옵션을 쓰면 됩니다. exec 옵션 뒤에 수행할 명령을 입력하면 되고, 파일명은 {} 자리에 대체하여 들어가게 됩니다. 그리고 마지막에 ; (semi-colon)을 넣는데 이 역시 \로 이스케이프 시켜야 합니다.

그래서 아래의 커맨드는 위의 xargs를 사용한 것과 동일한 일을 합니다.

find /usr/local/apache-tomcat-7.0.34/logs -mtime +7 -name catalina\* -exec wc {} \;


wc명령의 결과로 라인수, 단어수 그리고 글자수가 출력이 되고 이어서 파일명이 출력됩니다.

그렇다면 7일이 지난 catalina로 시작되는 파일들을 지우려면 어떻게 하면 될까요? 네... 바로 wc 대신 rm 을 쓰면 됩니다. 간단하죠?

find /usr/local/apache-tomcat-7.0.34/logs -mtime +7 -name catalina\* -exec rm {} \;

로그 삭제 스케쥴 등록하기

Linux를 포함한 유닉스 운영체제에서 스케쥴을 등록하고 지정한 시각에 자동으로 어떤 명령을 실행하는 방법으로 가장 보편적인 것이 cron입니다. cron으로 단순한 스케쥴 뿐 아니라 다양한 응용이 가능합니다. 저는 cron을 이용하여 무정지로 돌아야하는 데몬(daemon)이 다운되었을 때 재기동 시키는 용도로도 사용합니다. 이에 대해서는 별도의 글로 소개 드리도록 하겠습니다.

cron을 사용할 때 유의할 점은 cron을 실행하는 유저의 시작 스크립트를 실행하지 않기 때문에 무설정 상태로 돈다는 겁니다. 그래서 종종 cron에 등록한 명령이 제대로 실행되지 않는다는 불만이 접수되기도 합니다. 일반적으로 사용자 로그인을 하게 되면 .bashrc 등의 시작 스크립트를 실행하게 되고 이 스크립트 안에는 PATH나 LD_LIBRARY_PATH와 같은 중요한 환경변수들을 설정하는 부분이 있습니다.

하지만 cron은 그렇지 않다는 점에 유의해야 합니다. 물론 요즘 Debian계열에서 배포되는 cron에는 crontab 구문 선두에 환경변수를 지정하는 기능이 있어 편리하기는 합니다만 보편적인 문법은 아닙니다.

가장 보편적인 방법은 find 명령을 실행할 쉘 스크립트를 따로 만드는 겁니다. 보통 로그를 지우는 명령줄이 한 줄로 구성되지 않기 때문에 crontab에 일일이 등록하면 지저분하죠. 깔금한 정리를 위해서도 쉘 스크립트를 만드는게 좋습니다. 예를 들어 아래와 같이 Tomcat에서 생성되는 네가지 로그파일에 대해 각각 보존하는 기간을 달리하는 find 명령을 나열하고 그 선두에 PATH 설정을 해 둠으로서 경로를 찾지 못해 발생하는 에러를 미연에 방지하는 것이지요. 이외에 필요한 환경변수들을 추가로 설정하면 됩니다.

#!/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

find /usr/local/apache-tomcat-7.0.34/logs -mtime +7 -name catalina\* -exec rm {} \;
find /usr/local/apache-tomcat-7.0.34/logs -mtime +31 -name localhost_access_log\* -exec rm {} \;
find /usr/local/apache-tomcat-7.0.34/logs -mtime +14 -name host-manager\* -exec rm {} \;
find /usr/local/apache-tomcat-7.0.34/logs -mtime +14 -name manager\* -exec rm {} \;

위와 같이 편집하여 del_logs.sh 이라는 이름으로 만들고 저장해 둡니다.

Tomcat의 로그를 지우려면 root 권한에서 지워야 하므로 root 계정으로 들어갑니다. 그리고 다음과 같은 명령으로 crontab을 수정합니다.

crontab -e 

이 명령을 실행하면 지정해 둔 에디터(보통 nano나 vi)가 나와서 스케쥴을 등록할 수 있게 됩니다.

0   1  *  *  *    /root/del_logs.sh 

위와 같이 등록하면 매일 새벽 1시 정각에 del_logs.sh 파일을 실행하게 되고 이 쉘 스크립트에 기술된 대로 오래된 로그파일들을 자동으로 지우게 됩니다. 스크립트 경로 앞에 쓴 6개의 필드는 각각 분(minute), 시(hour), 일(day of month), 월(month), 요일(weekday) 을 의미합니다. *는 특별히 지정하지 않는다는 의미로 위와 같이 하면 매일 새벽 1시가 지정되는 것이지요.

이렇게 간단한 방법으로 오래된 로그를 자동으로 지울 수 있습니다. 새로 시스템을 설정할 때 이 설정을 빼먹지 않도록 유의하시기 바랍니다.

댓글 없음:

댓글 쓰기