[logback] 로그백 로그파일 롤링 커스터마이징
(logback using java file time rolling)
#로그백 타임롤링은 1초단위, 1분단위, 1시간단위, 1일단위, 1달단위, 1년단위로는 로그파일을 자유롭게 생성 할 수 있지만 내가 원하는 시간에 맞추어서 할 수는 없다. 그래서 구글링을 해보니 자바를 불러와서 어느정도 내 마음대로 할 수 있도록 구현을 하는 방법이 있었음.
아래 예제는 10분단위로 로그파일 생성되도록 구현한 내용임. 내가 기억하려고 블로그에 남김 ㅋㅋ
1.logback.xml 에 어펜더 추가. 굵은 글씨의 클래스 적용
<appender name="test-appender" class="com.test.TestAppender">
<file>/test/test.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>
/test/%d{yyyyMMdd,aux}/%d{yyyyMMddHHmm}.log
</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{5} - %msg%n
</pattern>
</encoder>
</appender>
2. TestAppender.java 생성
package com.test;
import java.text.SimpleDateFormat;
import java.util.Date;
import ch.qos.logback.core.rolling.RollingFileAppender;
public class TestAppender<E> extends RollingFileAppender<E>{
private static long start = System.currentTimeMillis(); // minutes
private int rollOverTimeInMinutes = 10; // 여기에 설정한 10분마다 롤링됨
@Override
public void rollover(){
try{
int maxIntervalSinceLastLoggingInMillis = rollOverTimeInMinutes * 60 * 1000;
long currentTime = System.currentTimeMillis();
long start_rtn_str = getProc(start);
if ((currentTime - start_rtn_str) >= maxIntervalSinceLastLoggingInMillis){
super.rollover();
start = System.currentTimeMillis();
}
}catch(Exception e){
}
}
// currentTimeMillis 를 받아서 yyyyMMddHHmm 으로 변환 후에 분단위를 0으로 만든 후에 다시 currentTimeMillis 형태로 리턴(분단위 절삭).
public static long getProc(long in_str) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
String fmt1 = sdf.format(new Date(in_str));
String fmt2 = fmt1.substring(0, 11)+"0";
long rtn_str = cast_sdf_ctm(fmt2);
return rtn_str;
}
// SimpleDateFormat 형태의 스트링을 받아서 currentTimeMillis 형태로 변환. ex) cast_sdf_ctm("20151008165215");
public static long cast_sdf_ctm(String str) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
Date date = sdf.parse(str);
long rtn_str = date.getTime();
return rtn_str;
}
// currentTimeMillis 형태의 스트링을 받아서 SimpleDateFormat 형태로 변환. ex) cast_ctm_sdf( 1444300680353, "yyyyMMddHHmmss")
public static String cast_ctm_sdf(long str, String fmt) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat(fmt);
String rtn_str = sdf.format(new Date(str));
return rtn_str;
}
}