log4j 압축과 삭제 자동화

[Desc] 

log4j를 사용해야만 할때 서버의 log파일이 쌓여 관리하기 귀찮을때...

로그관리를 crontab에서 sh파일을 따로 만들어서 관리를 할수도 있겠지만

개발자가 자신의 프로젝트에서 관리할수 있도록 관리포인트를 하나만 두기 위해서 custom한 log4j를 만들었습니다.


좀 복잡할수 있습니다 사용하기 위해서는 규칙을 잘 따라야합니다.



 
 
   


우선 customLog4j를 사용하기 위해서 추가된 Param을 설명하겠습니다.


1. maxBackupIndex='62'


위 Param은 log파일의 유지갯수라고 생각하면 된다.

즉 62개의 log파일이 생성이 된다면 log파일을 압축을 하겠다는 것이다.

압축을 할때는 오래된 한달치만 압축이 됩니다.


Ex)

test.log.2016-01-01 .... test.log.2016-01-31 (현재 31개의 로그파일)

test.log.2016-02-02 .... test.log.2016-02-28 (현재 28개의 로그파일)

test.log.2016-03-01 .... test.log.2016-03-04 총 62개를 넘어 다음날 63개의 log가 만들어질 시점


이때 test.log.2016-01 달의 로그파일들이 압축이 되고 해당로그파일들은 지워지게 됩니다.

압축이름은 backup-test.log-2016-01.tag.gz 으로 압축이 됩니다.


log파일을 생성할때 Pattern.yyyy-mm-dd 로 만들어 주셔야 합니다.

파일갯수를 세거나 날짜를 파악할때 파일패턴들을 저런형식인 파일들을 체크하게 해두었기 때문입니다.

이게 싫으시면 customDailyRollingFileAppender.java파일에서 변경을 해서 쓰시면 됩니다.


2.maxVolumnPercent, maxBackupTarCnt, maxBackupYN

위 Param은 서버용량체크 할때 사용합니다.


아래 포스팅을 보면 [기타] 에서 

2018/01/10 - [Operation System/Linux 일반] - [Linux] 유용한 명령어


df -h | grep '/dev/...3' | awk {'print $5'} | sed 's/%//g' //용량 체크

이부분이 있는데 customDailyRollingFileAppender.java 파일에 보시면 해당명령어로 용량을 체크합니다.

제가 현재 이용하고 있는 서버에서는 


Filesystem      Size  Used Avail Use% Mounted on

/dev/vda3        31G   15G   15G  51% /

tmpfs           1.9G     0  1.9G   0% /dev/shm

/dev/vda1       477M   97M  355M  22% /boot


이부분을 체크하고 있습니다. 위의 명령어를 사용하면

51이라는 숫자가 나오게 됩니다. 이부분이 서버의 용량을 체크하는 부분입니다.



maxVolumnPercent라는 건 바로 51 이 퍼센티지를 의미합니다.

'80' 이라는건 서버용량이 80%이상일때를 의미합니다.

80%이상일때 압축이된 backup-test.???.tar.gz 의 파일들을 삭제하겠다는겁니다.


maxBackupTarCnt라는건 ??.tar.gz을 삭제할때 최신일순으로 몇개의 백업파일을 남길 갯수입니다.

서버용량이 80이상일때 아래와 같이 백업파일들이 있으면


backup-test.log.2016-01.tar.gz

backup-test.log.2016-02.tar.gz

backup-test.log.2016-03.tar.gz

backup-test_Error.log.2016-01.tar.gz

backup-test_Error.log.2016-02.tar.gz

backup-test_Error.log.2016-03.tar.gz

backup-test_Sql.log.2016-01.tar.gz

backup-test_Sql.log.2016-02.tar.gz

backup-test_Sql.log.2016-03.tar.gz


maxBackupTarCnt=3 으로 설정했을 경우

backup-test.log.2016-03.tar.gz

backup-test_Error.log.2016-03.tar.gz

backup-test_Sql.log.2016-03.tar.gz

이렇게 최신압축파일 3개만 남기고 삭제하겠다는겁니다.


ls -t '/app/tomcat/logs/test' | grep tar.gz | tail -n +5 | xargs -i rm -f /app/tomcat/logs/test/{} //최신파일의 5개만 남기고 삭제하는 명령어


위와 같은 명령어를 사용하여 압축파일을 삭제하는 겁니다.


maxBackupYN은 로그파일을 

test.log도 있고 test_error로도 남기고 test_sql로도 다들 따로 남기고 있을때

어차피 저3개의 로그파일중에 매일 생성되는 로그에다가만 Y로 설정을 해서 위의 Param들을 설정하시면 됩니다.


defaultN입니다.


test.log파일 생성될때만 위의 3개의 Param을 설정하시면 됩니다.

왜냐면 다른파일들이 생성될때 불필요하게 또 체크할 필요가 없기 때문입니다.

-----

설명이 약간 부족하여 추가하겠습니다


로그파일을 만들때 예를들어 3가지 파일을 만든다고하겠습니다.

일반적인 로그파일을 쌓을 test.log라는 파일 test_error.log파일 test_sql.log 파일이렇게 만들었다고 한다면

maxVolumnPercent, maxBackupTarCnt, maxBackupYN

위 3개의 파라미터로 서버의 용량을 확인하고 backup압축파일들을 삭제처리를 하는데

이런 모니터링 시점은 day(일)자가 지나가면서 새로운 log파일을 생성할 때 처리를 합니다.

따라서 한번만 체크하면 되기 때문에 각각의 로그파일들(test.log,test_error.log,test_sql.log)이 생성될때

3번 체크할 필요는 없고 한번만 체크하면 되기 때문에

maxVolumnPercent, maxBackupTarCnt, maxBackupYN

위의 파라미터는 3개의 로그파일 쌓는 내용중에 한곳에다가만 셋팅하시면 됩니다.

(그러면 해당 로그파일이 생성될 시점에 모니터링을 하여 용량체크하여 삭제처리를합니다)

나머지는 저위의 파라미터를 설정안해도 default가 N이기 때문에 자동으로 모니터링을 하지 않습니다.


따라서 아래 설정부분을 보시면 아시겠지만 위의 3가지 파라미터는 한곳의 log파일만드는곳에만 넣었습니다.



[설치 및 설정]


1단계 : 다운로드 (CustomDailyRollingFileAppender.java)

         위의 파일을 다운로드 후 src/java/원하는 곳에 넣어주세요


2단계

로그파일형식은 필수 #원하는 로그파일이름.2017-01-01 이형식을 맞추어 주셔야합니다.

log4j.properties나 log4j.xml을 수정하시면 됩니다.

//org.apache.log4j.DailyRollingFileAppender 부분을 com.test.common.util.CustomDailyRollingFileAppender 이렇게 변경하고
// 부분을 추가합니다.
//value=62는 최근파일 62개는 압축안한다라고 생각하시면 편할 것 같습니다. 한달이 지나면 62개이상일 경우 가장오래된 한달치로그를 압축합니다
  
	//xml일경우
	
    
        
        
        
        
         
         
           
        
            
        
    
     
    
    
        
        
        
         
        
            
        
    
  
	//properties파일일경우
	log4j.appender.test=com.test.common.util.CustomDailyRollingFileAppender
	log4j.appender.test.File=/app/tomcat/logs/TEST_OPEN_API/test11OpenApi.log
	log4j.appender.test.DatePattern='.'yyyy-MM-dd
	log4j.appender.test.Append=true
	log4j.appender.test.maxBackupIndex=62
	log4j.appender.test.maxVolumnPercent=80
	log4j.appender.test.maxBackupTarCnt=5
	log4j.appender.test.maxBackupYN=Y
	log4j.appender.test.layout=org.apache.log4j.PatternLayout
	log4j.appender.test.layout.ConversionPattern=[%d{yyyyMMdd HH:mm:ss,SSS}] [%-5p] <%l>: %m%n
	log4j.appender.test.Encoding=UTF-8


3단계 (추가정보)

org.apache.log4j.DailyRollingFileAppender 클래스파일은 

org.apache.log4j.FileAppender를 상속받아서 수행하는 클래스파일입니다.

따라서 CustomDailyRollingFileAppender 또한 FileAppender를 상속받아서 

제가 원하는 동작을 추가하여 Custom하게 재작성하였기 때문에 

기존 log4j에서 DailyRollingFileAppender 수행하는 작업 + 추가된 작업이 동작하게 됩니다.



4단계 - 로컬테스트방법

환경변수에 alzip추가 C:\Program Files (x86)\ESTsoft\ALZip;

CusomDailyRollingFileAppender 부분에서 run() 부분 local테스트시 주석해제

CusomDailyRollingFileAppender >> RunProcessThread클래스에서 maxBackupIndex부분 갯수를 2~3개로 변경

실제 파일의 날짜가 2~3개가 있어야하고 한달이 지날수 있도록 logfilename로그가 한달지난 날짜의 로그가 있어야합니다.

그래야 로그파일을 새로생성합니다.

newFileTime이라는 포터블 프로그램 다운로드해서 파일 시간 변경하여 테스트해보면 됩니다 

또는 윈도우 날짜를 조작해도 됩니다.

newFileTime 파일다운로드 주소 - http://www.softwareok.com/






블로그 이미지

pstree

pstree.. process...

,