리눅스환경에서 로그파일을 날짜별 혹은 용량별로 쌓게 하는 다양한 방법들이 존재한다. 각각은 장단점을 갖고 있는데, 용도에 따라 어떤 방법을 선택할지 결정하는 것이 마땅하다. 선택포인트가 될  장단점을 비교해보았다...


1. logrotate(한글)

리눅스의 기본어플리케이션이며, 로그를 쌓을때 로테이션을 주도록하는 것이 아니라, 이미 쌓인 로그파일을 조작하는 방식이다. 보통 cron에 의해 주기적으로 호출되어 로테이션 로그파일을 만든다.

장점 : 로테이션, 압축, 파일갯수 제한등 각종 로그관련 작업들이 한방에 가능하다.

단점 : 파이프방식을 통해 쌓여지는 로그파일의 경우, 기존파일 삭제가 불가능하기 때문에(삭제하면 로그파일이 쌓이지 않기 때문에) 프로세스를 내렸다 올리는 스크립트를 설정하거나 copytruncate방식을 이용해야만 한다. 프로세스를 올렸다 내리는것은 서비스 운영에 지장을 줄 수 있고, copytruncate방식은 copy가 시작되는 시점과 truncate가 완료되는 시점 사이의 로그가 분실되게 된다. 또한 일정버전 이하(dateext를 쓸수없는)에서는 파일명을 날짜형태로 줄 수 없다.

2. cronolog

어플리케이션 구동시 로그 파일의 파이프를 cronolog프로세스로 지정하는 방식으로 사용한다.

장점 : 손실없는 완벽한 로그 로테이션이 가능하다

단점 : 별도의 프로세스 띄우고 이를 통해 로그를 쌓기 때문에 약간의 부하가 있다. 메인프로세스를 죽일때 함께 프로세스가 죽지 않는 경우가 있어 체크를 해줘야 한다. 파일용량에 따른 로테이션이 불가능하다. 압축과 삭제등은 별도로 해줘야 한다.

3. rotatelogs(한글)

Apache HTTP Server의 서브 어플리케이션이다. cronolog와 비슷하며, 용량별 파일로테이션을 지원한다.

장점 : cronolog와 같으며, 용량별 로테이션이 가능하다

단점 : cronolog와 같으며, Apache HTTP Server를 설치해야만 한다.


로그파일을 가지고 통계를 산출한다던가 할 때에는 정확성을 요하는 2/3번 방법을, 단지 버그추적을 위해서거나 만약을 대비하는 로그라면 설정과 유지보수가 간편한 1번 방법을 추천하겠다. 

Posted by A.J.Kuhn

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

휘발성으로 이용되는 파일들이나 로그파일등.. 파일이 생성된지 일정기간이 경과하면 파일을 삭제해야하는(하는게 좋은) 파일들이 있다. 이들을 삭제하기 위한 방법은....

* 생성된지 30일 이상 된 파일만 삭제

/usr/bin/find "대상디렉토리" -type f -ctime +30 -exec /bin/rm -rf {} \;

* 생성된지 30일 이상 된 비어있는 디렉토리만 삭제

/usr/bin/find "대상디렉토리" -empty -type d -ctime +30 -exec /bin/rmdir {} \;

리눅스 버전에 따라 -ctime이 먹지 않는 경우가 있다. 이때는 -mtime으로 대체(의미는 약간 다르지만)한다.

이러한 쉘을 crontab에 하루단위로 동작하도록 등록해두면 편리하겠죵?

Posted by A.J.Kuhn

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

Apache나 Tomcat을 비롯한 많은 서버 어플리케이션들이 로그를 생성하며, 그들은 날짜기반의 로그파일 명을 갖는 경우가 많다. 로그파일은 순수 텍스트기반의 파일로서 압축률이 매우 좋기 때문에, 지난 로그파일들은 압축해서 보관하는 것이 효과적이다.

일 단위 로그는 금일 24시가 지난뒤에야 최종 완성된 로그파일이 생기기 때문에 익일에 파일을 압축하여야 한다. 때문에 crontab에 다음과 같이 등록해준다.
1 0 * * * /opt/script/compress_log.sh

compress_log.sh은 아래와 같이 편집하고 반드시 실행권한을 준다.
gzip /usr/local/apache2/logs/access.log.`date +%Y%m%d --date="1 days ago"`

결국 일자가 포함된 파일명을 추출하는 `date +%Y%m%d --date="1 days ago"`부분이 핵심이다.

crontab의 구체적 사용법은 여기를 참조한다.
Posted by A.J.Kuhn

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

crontab -e로 편집모드로 진입. 편집이 완료되면 :wq 로 종료
별도의 재기동절차는 필요없다.

Quick Reference는 아래를 참조
http://www.adminschoice.com/docs/crontab.htm

원문 : http://hbesthee.tistory.com/276

cron 데몬이 지정된 시간에 주기적인 처리를 위한 정보를 저장해 두는 테이블 파일입니다.

각 줄은 "다섯개의 시간과 날짜 필드, 다음에, 사용자 이름(시스템 crontab 파일일 경우), 다음에 실행될 명령" 이런 형식이다. 지정한 명령은 데몬에 의해, 지정한 날짜, 시간에 실행된다.

필드           사용할 수 있는 값
-----         -----------------
            0-59
            0-23
날짜          0-31
            0-12 (아래 참조, 달 이름을 사용 가능)
요일          0-7 (0 또는 7: 일요일 , 요일이름을 사용 가능)

한 필드에 `*' 문자가 올 수 있는데, 이것은 그 단위 전체를 말한다. (예를 들어, 날짜 부분에 `*' 문자가 오면 `매일'을 뜻한다)
숫자의 범위가 사용될 수 있다. 범위는 하이픈(`-') 문자로 지정하며, 앞에 숫자가 뒷 숫자보다 작아야한다. 예를 들어, 시간 필드에 8-11 이 오면, 8, 9, 10, 11시를 뜻한다.
또한 이 값들은 나열될 수 있으며, 그 구분은 쉼표(`,')로 한다. 예: 1,2,5,9, 0-4,8-12.
값의 범위를 지정할 때, 특정 단위로 건너 뛸 수 있는데, 이것은 그 범위 다음에 `/<숫자>' 형식으로 덧붙혀 준다. 예를 들어, 시간 필드에 `0-23/2' 값이 사용되면, 이것은 두시간 마다, 즉 `0,2,4,6,8,10,12,14,16,18,20,22' 시를 뜻한다. 또한 `매 두시간 마다'라는 뜻으로, `*/2' 이런식으로 사용될 수 있다.
여섯번째 필드(줄의 마지막)에는 실행시킬 명령이 온다. 그 명령이 실행될 때 줄을 나누는 것은 `%' 문자로 하며, 즉, 이것은 쉘에 의해서 다른 명령이 실행됨을 의미한다. (`%' 문자 앞에 있는 것이 하나의 쉘 명령이며, 뒤에 있는 것이 또다른 하나의 쉘 명령임을 뜻한다.) 또한 한 명령인데, 부득이하게 줄을 나누워야 할 경우에는 백슬래쉬(\) 문자를 사용한다.

다른 유저의 profile을 이용해야 하는 경우에는 다음과 같이 처리한다.
/bin/su - myuser -c "myprog">/dev/null 2>&1


@ 주의점
줄, 공문자나, 탭문자로 시작하는 줄, 줄 첫칸에 `#' 문자가 있는 줄은 모두 무시된다.
명령이 지정되어 있는 줄 안에서는 주석을 사용할 수 없다.
환경변수 설정하는 곳에는 이 주석문을 사용할 수 없다.

@ 사용예제
# 명령어를 실행 쉘 지정
SHELL=/bin/sh
# 편지를 받을 사용자 지정
MAILTO=paul
#
# 매일 00시 05분에 특정작업을 하는 경우
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# 매달 1일 오후 2시 15분에
15 14 1 * *     $HOME/bin/monthly
# 월요일부터 금요일 까지 매일 오후 10시에.
0 22 * * 1-5   mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
23 0-23/2 * * * echo "이것은 매일 0, 2, 4, ... 시 23분에 보여집니다."
5 4 * * sun     echo "이것은 매 일요일 오전 4시 5분에 보여집니다."

Posted by A.J.Kuhn

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절


BLOG main image
A.J.Kuhn, Endless supply of passion!
Generalist A.J.Kuhn의 general한 이야기 by A.J.Kuhn

카테고리

분류 전체보기 (180)
Human (4)
Employee (7)
Developer (14)
Musician (11)
Snowboarder (24)
Traveler (0)
Reviewer (119)
Diver (0)
Driver (1)

글 보관함

달력

«   2019/10   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
Total : 213,108
Today : 0 Yesterday : 6