개발/Tool

[lotate]logrotate

gonGon 2010. 5. 17. 15:59
웹로직에서 managedservice로 service를 올렸는데 script를 아래처럼 해 놓았다.
[lawuser@was ipccDomain]$ cat startAdmin.sh
echo "AdminServer started..."

USER_MEM_ARGS="-DipccAdminServer -Xms512m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=256m -verbose:gc -Xloggc:./logs/ipccAdmin_GC.`date +'%y%m%d_%H%M'`.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+HeapDumpOnOutOfMemoryError"
export USER_MEM_ARGS
mv ./admin.out ./logs/admin.`date +'%y%m%d_%H%M'`.out
nohup ./bin/startWebLogic.sh > admin.out & 2>&1

tail -f admin.out

[lawuser@was ipccDomain]$ cat {MANAGED_SERVICE_NAME}.sh
echo "XXXXAppServer started..."

USER_MEM_ARGS="-DipccAppServer -Xms2048m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=384m -XX:PermSize=384m -XX:MaxPermSize=384m -verbose:gc -Xloggc:./logs/ipccSvr_GC.`date +'%y%m%d_%H%M'`.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+HeapDumpOnOutOfMemoryError"
export USER_MEM_ARGS
mv ./ipccSvr.out ./logs/ipccSvr.`date +'%y%m%d_%H%M'`.out
nohup ./bin/startManagedWebLogic.sh XXXXAppServer t3://192.168.10.31:7001 > ipccSvr.out & 2>&1

tail -f XXXX.out

위 환경에서 로그를 일자별로 rotate하려면 매일 23:59에 재기동을 해 주어야 한다.

log를 rotate하는 방법을 검색해 보았다.

1. shell
/bin/cat /dev/null > XXXX.out

cat을 사용해서 파일을 비우는 방법이다. 그러나 process가 사용중인 파일에 대해서는 작동하지 않는다.
split 도 마찬가지다. truncate 도 있는데 이는 별도의 프로그래밍이 필요하므로 패스했다.

2. logrotate
검색해보면 자료가 많다.

root권한으로 /etc/logrotate.d/에 서비스에 해당하는 파일을 만들면 된다.
vi /etc/logrotate.d/teleproLog
/etc/logrotate.d/teleproLog{
missingok
notifempty
rotate 30
daily
copytruncate
dateext
postrotate
/bin/chown was:was /logs/teleproLog.out*
endscript
}

missingok : 파일이 없어도 그냥 진행한다.
notifempty : 로그파일에 내용이 없으면 수행하지 않는다. (0k라도 복사할 것이라면 지우자.)
rotate 30 : 모두 30개만 rotate시킨다. 30개가 넘으면 지운다.
daily : 매일 수행한다. ( weekly|monthly|...)
copytruncate : roate한 파일은 내용을 지운다!!
dateext : rotate한 파일의 확장자는 날짜 형식을 사용한다. (yyyymmdd, 아니면 0, 1, 2,.. 와 같이 붙는다.)
postrotate : rotate 이후의 작업을 등록한다. logrotate는 root 권한이므로 rotate한 파일의 권한을 바꾸어주자.

실행 : logrotate -f /etc/logrotate.d/teleproLog
실행 명령을 crontab에 등록시키거나 /etc/logrotate.conf에 등록한다.
/etc/logrotate.conf에 등록된 내용은 /etc/cron.daily/logroate에 의해 매일 실행된다.
         



3. cronoLog
별도의 데몬을 띄우고 로그 출력 파이프를 그 쪽으로 지정한다.
프로그램을 설치해야 하고, was 재기동시 cronoLog데몬도 고려해야 한다고 해서 기각.

4. 그 외.
apache rotatelogs, log4j 등이 있다. 결론은 그냥 log4j를 쓰는 게 젤 속편하다.

사족 : jedi의 log를 그냥 쓰고 싶었는데 jedi_home을 폴더채로 매일 백업하고 있어서 log를 빼고 지정하기가 귀찮았다. 로그를 jedi_home 밖으로 뺄 수 없다는 건 개선사항일 듯 싶다.