JAVA/SPRING/JAVA

[logback] 로그백 로그파일 롤링 커스터마이징

junhokim 2017. 11. 29. 20:29
반응형


(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;
 }
 

}


반응형