2015-08-16 17 views
3

我有一個關於的logback的問題。復位的logback追加程序

短版

如果一個appender創建失敗(例如權限被拒絕),我該如何明確重新嘗試創建它時的權限問題得到解決。我正在使用XML配置。我想在不重新啓動我的過程的情況下執行此操作。

加長版

我使用的logback在Android(logback-android)。

我記錄到所述外部存儲器的目錄,這意味着,如果所述用戶將設備連接到PC,使大容量存儲,該目錄的文件系統將被卸載。

如果應用程序被啓動,而該目錄是不可用的,我告知用戶,但由於記錄器被定義爲靜態字段...

private static final Logger LOG = LoggerFactory.getLogger(MyApplication.class); 

...的logback試圖反正創建的appender當我的類由類加載器加載並失敗時。

由於Android的工作原理,即使用戶離開我的應用程序的所有屏幕(例如轉到主屏幕),應用程序也會繼續運行,因此appender將永遠不會被重新嘗試創建。

有什麼辦法來重置從配置的附加目的地?如果是這樣,每當用戶進入我的應用程序的初始屏幕時,我可以嘗試重新設置Logback。

我嘗試使用,以阻止它......

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 
if (loggerContext != null) 
    loggerContext.stop(); 

...這似乎很好地工作,但我似乎不能夠重新啓動它:

loggerContext.start() 

這似乎並沒有重新創建的appender。

很多感謝的幫助。

回答

1

重新啓動附加器可以通過重裝的logback的配置來實現。在我的情況下,我有一個XML文件的配置,所以我用了一些東西:

// reset the default context (which may already have been initialized) 
// since we want to reconfigure it 
LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory(); 
lc.reset(); 

JoranConfigurator config = new JoranConfigurator(); 
config.setContext(lc); 

try { 
    config.doConfigure("/path/to/config.xml"); 
} catch (JoranException e) { 
    e.printStackTrace(); 
} 
0

我有完全相同的問題。我把記錄器爲靜態變量因此不得不讓他們重新復位。解決的辦法是如下:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
// Copy current loggers, necessary to keep logging. 
List<LoggerContextListener> loggers = lc.getCopyOfListenerList(); 
lc.reset(); 
JoranConfigurator config = new JoranConfigurator(); 
config.setContext(lc); 

try { 
    // Context ctx; 
    InputStream inputStream = ctx.getAssets().open("logback.xml"); 
    config.doConfigure(inputStream); 
    for (LoggerContextListener l : loggers) { 
     lc.addListener(l); // restore loggers 
    } 
} catch (JoranException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
log.info("logger reset"); 

以下assets/logback.xml

<configuration> 
    <property name="EXT_CACHE_DIR" value="${EXT_DIR:-/sdcard}/Android/data/${PACKAGE_NAME}/cache"/> 
    <!-- Create a logcat appender --> 
    <appender name="logcat" class="ch.qos.logback.classic.android.LogcatAppender"> 
    <encoder> 
     <pattern>%msg%n</pattern> 
    </encoder> 
    </appender> 

    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${EXT_CACHE_DIR}/logs/current.log</file> 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <!-- rollover hourly --> 
     <fileNamePattern>${EXT_CACHE_DIR}/logs/%d{yyyy-MM-dd_HH,UTC}.%i.log.gz</fileNamePattern> 
     <timeBasedFileNamingAndTriggeringPolicy 
      class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 
      <maxFileSize>100KB</maxFileSize> 
     </timeBasedFileNamingAndTriggeringPolicy> 
     <maxHistory>30</maxHistory> 
    </rollingPolicy> 
    <encoder> 
     <pattern>%-5relative %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}: %msg%n</pattern> 
    </encoder> 
    </appender> 

    <root level="DEBUG"> 
    <appender-ref ref="logcat" /> 
    <appender-ref ref="ROLLING" /> 
    </root> 
</configuration> 

我遇到的問題是:這個文件appender不初始化。