2012-02-03 2 views
4

내 클래스 코드는 다음과 같습니다.사용자 지정 log4j 롤링 appender

public class LogLevelFilterFileAppender extends FileAppender implements Cloneable{ 

    private final static String DOT = "."; 
    private final static String DASH = "-"; 
    private static final String ORIGINAL_FILE_NAME = "OrginalLogFileName"; 

    public LogLevelFilterFileAppender() {} 

    public LogLevelFilterFileAppender(Layout layout, String fileName, 
             boolean append, boolean bufferedIO, int bufferSize) 
    throws IOException { 
     new FileAppender(layout, fileName, append, bufferedIO, 10); 
     new RollingFileAppender(layout, fileName,append); 
    } 

    public LogLevelFilterFileAppender(Layout layout, String fileName, 
             boolean append) throws IOException { 
     super(layout, fileName, append); 
     new RollingFileAppender(layout, fileName,append); 
    } 

    public LogLevelFilterFileAppender(Layout layout, String fileName) 
    throws IOException { 
     super(layout, fileName); 
     new RollingFileAppender(layout, fileName); 
    } 

    @Override 
    public void activateOptions() { 
     MDC.put(ORIGINAL_FILE_NAME, fileName); 
     super.activateOptions(); 
    } 

    @Override 
    public void append(LoggingEvent event) { 
     try { 
      setFile(appendLevelToFileName((String) MDC.get(ORIGINAL_FILE_NAME), 
        event.getLevel().toString()), fileAppend, bufferedIO, 
        bufferSize); 
     } 
     catch (IOException ie) { 
      errorHandler 
      .error(
        "Error occured while setting file for the log level " 
        + event.getLevel(), ie, 
        ErrorCode.FILE_OPEN_FAILURE); 
     } 
     super.append(event); 
    } 

    private String appendLevelToFileName(String oldLogFileName, String level) { 
     if (oldLogFileName != null) { 
      final File logFile = new File(oldLogFileName); 
      String newFileName = ""; 
      final String fn = logFile.getName(); 
      final int dotIndex = fn.indexOf(DOT); 
      if (dotIndex != -1) { 
       newFileName = fn.substring(0, dotIndex) + DASH + level + DOT 
       + fn.substring(dotIndex + 1); 
      } 
      else { 
       newFileName = fn + DASH + level; 
      } 
      return logFile.getParent() + File.separator + newFileName; 
     } 
     return null; 
    } 
} 

내 log4j.properties 구성은 다음과 같습니다.

log4j.rootLogger = DEBUG, fileout 
log4j.appender.fileout = com.elitecore.mediation.util.log.LogLevelFilterFileAppender 
log4j.appender.fileout.layout.ConversionPattern = %d{MMMMM dd,yyyy HH:mm:ss} %-5p [ %C{1} - %M() - %L ] - %m%n 
# log4j.appender.fileout.layout.ConversionPattern = %d{MMMMM dd,yyyy HH:mm:ss} %-5p %c %M():%L - %m%n 
# %r [%t] %-5p %c %x - %m%n 
# %d{MMMMM dd HH:mm:ss} %-5p %c %M():%L - %m%n 
#%d{MMMMM dd HH:mm:ss} %6p %c %M() : %m%n 
log4j.appender.fileout.layout = org.apache.log4j.PatternLayout 
log4j.appender.fileout.File = /usr/local/mediation/logs/mediation-logs.log 

다른 로그 파일에 다른 유형 (예 : DEBUG, ERROR 및 INFO)의 로그가 생성됩니다. 그러나 그것의 한계는 무엇입니까? 그것은 더 크고 더 큰 로그 파일을 생성합니다. 말하자면 5   MB의 로그 파일을 만들고 싶기 때문에 이전 로그를 제거해야합니다. 어떻게해야합니까? RollingFile Appender를 사용해 보았을 때 아래의 로그 파일 만 받았습니다. 로그 파일 ERROR

[[email protected] logs]# ls -1 
mediation-logs-DEBUG.log 
mediation-logs-ERROR.log 
mediation-logs-INFO.log 
mediation-logs-INFO.log.1 
mediation-logs-INFO.log.2 
mediation-logs.log 

롤링, DEBUG이 수행되지 않지만 INFO이 이루어집니다.

답변

1

FileAppender 대신 RollingFileAppender에서 파생 된 것이 좋습니다. 이렇게하면 로그 파일의 크기가 커지고 유지하려는 "오래된"파일의 수를 정의 할 수 있습니다. 나중에 log4j.propertiers에서 사용하는 방법은 the manual을 확인하십시오.

제대로 이해하면 로그 수준 당 하나의 파일을 원하십니까? 그렇다면, 당신은 오히려 "롤링"자신의 솔루션보다이 FAQ - 입력 :

Matching exact log-levels

+0

내가 RollingFileAppender와 노력에 따라 제안한다. 하지만 내 문제는 로깅이 끝나면 로깅에 오류가 발생한다는 것입니다. 아래에서 설명한 것처럼 INFO 로그 만 롤링됩니다. '# 1! [루트 @는 로그를 관리] -1 중재-로그-debug.log를을 중재-로그-하는 error.log 중재 - 로그 - INFO.log 중재 - 로그 - INFO.log.1 중재-로그 -INFO.log.2 mediation-logs.log' –

+0

@BhavikAmbani 오류 메시지의 위치는 어디입니까? – quaylar

+0

@BhavikAmbani 어쩌면 디버그 및 오류가 롤오버 될 정도로 크지 않았습니까? RollingFileAppender의 클래스는 어떻게 생겼습니까? – quaylar

관련 문제