2012-02-03 66 views
4

我的課程代碼如下。自定義log4j滾動附件

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進行嘗試時,我只能看到下面的日誌文件。

[[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 

滾動的日誌文件ERRORDEBUG沒有這樣做,而是INFO完成。

回答

1

我建議你從RollingFileAppender派生而不是FileAppender。這將使您可以定義日誌文件的大小,以及要保留多少「舊」文件。查看the manual關於如何在log4j.propertiers中稍後使用它。

如果我理解正確,你想每個日誌級別有一個文件,這是否正確?如果是的話,我建議你遵循這個FAQ入境,而不是「滾動」自己的解決方案:)

Matching exact log-levels

+0

我RollingFileAppender進行嘗試。但我的問題是,當日志記錄完成時,如下所述在日誌記錄中出現一些錯誤,只有INFO日誌的滾動已完成。 '[根@管理日誌]#LS -1 調解-日誌-的debug.log 調解-日誌-error.log中 調解-日誌-info.log建立 調解-日誌-INFO.log.1 調解-日誌-INFO.log.2 mediation-logs.log' – 2012-02-03 07:11:19

+0

@BhavikAmbani錯誤信息在哪裏? – quaylar 2012-02-03 07:14:15

+0

@BhavikAmbani可能DEBUG和ERROR只是不夠大而無法翻轉? RollingFileAppender的類是如何看起來的? – quaylar 2012-02-03 07:17:28