2014-10-06 34 views
1

我想以編程方式logappendar,但是這個代碼不correcty工作的logback添加appendar編程

這是我的配置代碼...

public enum Logger { 
    INSTANCE; 

    Logger logger; 
    LoggerContext loggerContext; 

    public final String CONSOLE_APPENDER_NAME="CONSOLE_"; 
    public final String FILE_APPENDER_NAME="FILE_"; 
    public final String LOGGER_NAME="LOGGER"; 
    public final String LOG_FILE_NAME="log.log"; 

    Logger(){ 
     loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 

     String patternRf = "%d{HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n"; 
     PatternLayoutEncoder encoder = new PatternLayoutEncoder(); 
     encoder.setPattern(patternRf); 
     encoder.setContext(loggerContext); 
     encoder.start(); 

     ConsoleAppender<ILoggingEvent> soutAppender = new ConsoleAppender<ILoggingEvent>(); 
     soutAppender.setName(CONSOLE_APPENDER_NAME); 
     soutAppender.setEncoder(encoder); 

     loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME).detachAndStopAllAppenders(); 
     logger = loggerContext.getLogger(LOGGER_NAME); 
     logger.detachAndStopAllAppenders(); 


     IPath logDirPath = new Path("/log"); 
     File logDir = new File(logDirPath.toOSString()); 
     if(!logDir.exists()){ 
      logDir.mkdir(); 
     } 
     RollingFileAppender<ILoggingEvent> rfAppender = rollingFileLog(logDirPath, loggerContext, encoder); 

     rfAppender.start(); 
     soutAppender.start(); 

     logger.addAppender(soutAppender); 
     logger.addAppender(rfAppender); 

    } 

    private RollingFileAppender<ILoggingEvent> rollingFileLog(IPath logDirPath, LoggerContext loggerContext, PatternLayoutEncoder encoder) { 
     RollingFileAppender<ILoggingEvent> logFileAppender = new RollingFileAppender<ILoggingEvent>(); 
     logFileAppender.setContext(loggerContext); 
     logFileAppender.setName(FILE_APPENDER_NAME); 
     logFileAppender.setEncoder(encoder); 
     logFileAppender.setAppend(true); 
     logFileAppender.setFile(logDirPath.append(LOG_FILE_NAME).toOSString()); 

     TimeBasedRollingPolicy<ILoggingEvent> logFilePolicy = new TimeBasedRollingPolicy<ILoggingEvent>(); 
     logFilePolicy.setContext(loggerContext); 
     logFilePolicy.setParent(logFileAppender); 
     logFilePolicy.setFileNamePattern("./log/%d{yyyy,aux}/%d{MM,aux}/%d{dd,aux}/service_rolling.log.%d{yyyy-MM-dd_hhmmss}"); 
     logFilePolicy.setMaxHistory(7); 
     logFilePolicy.start(); 

     logFileAppender.setRollingPolicy(logFilePolicy); 

     return logFileAppender; 
    } 

    public void debug(String msg){ 
     logger.debug(msg); 
    } 



} 

,這是我的測試代碼

public class test { 
    public static void main(String[] args) { 
     Logger.INSTANCE.debug("a"); 
     Logger.INSTANCE.debug("b"); 
     Logger.INSTANCE.debug("c"); 
     Logger.INSTANCE.debug("d"); 
     Logger.INSTANCE.debug("e"); 
     Logger.INSTANCE.debug("f"); 
     Logger.INSTANCE.debug("g"); 
     Logger.INSTANCE.debug("h"); 

    } 
} 

測試後我的控制檯wrriten此消息 11:14:53調試[線程1]登錄 - a

和我的日誌文件wrriten此消息

11:14:53 DEBUG [Thread-1] LOGGER - a 
11:14:53 DEBUG [Thread-1] LOGGER - b 
11:14:53 DEBUG [Thread-1] LOGGER - b 
11:14:53 DEBUG [Thread-1] LOGGER - c 
11:14:53 DEBUG [Thread-1] LOGGER - c 
11:14:53 DEBUG [Thread-1] LOGGER - d 
11:14:53 DEBUG [Thread-1] LOGGER - d 
11:14:53 DEBUG [Thread-1] LOGGER - e 
11:14:53 DEBUG [Thread-1] LOGGER - e 
11:14:53 DEBUG [Thread-1] LOGGER - f 
..... 

我認爲第一個日誌被writen勸慰

和別人是writen到文件

這是什麼程序的問題..

感謝

回答

1

我無法完全重現此行爲:將您的代碼(並使其編譯)寫入所有內容(tw冰)文件或一切(兩次)到控制檯,但不是控制檯的第一條語句和所有後續文件。

但是,您的代碼的問題是,顯然,您不能共享編碼器。如果將相同的編碼器設置爲文件appender和控制檯appender,則所有內容都將寫入文件或控制檯。嘗試爲您的文件appender創建第二個Encoder實例(您可以使用相同的配置)。

順便說一句:與其

loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME).detachAndStopAllAppenders(); 

你也可以使用

loggerContext.reset(); 

我覺得這,應該有同樣的效果。