簡體   English   中英

重置Logback Appender

[英]Reset Logback Appender

我有一個關於Logback的問題。

簡潔版本

如果appender的創建失敗(例如權限被拒絕),當解決權限問題時,如何顯式重新嘗試創建它。 我正在使用XML配置。 我想這樣做而不重新開始我的過程。

更長的版本

我在Android上使用Logback( logback-android )。

我正在登錄外部存儲器上的目錄,這意味着如果用戶將設備連接到PC並啟用大容量存儲,則將卸載目錄的文件系統。

如果應用程序啟動,但目錄不可用,我會通知用戶,但由於記錄器被定義為靜態字段...

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

...當我的類被類加載器加載並且失敗時,Logback嘗試創建appender。

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

有沒有辦法從配置中重置appender? 如果是這樣,只要用戶進入我的應用程序的初始屏幕,我就可以嘗試重置Logback。

我試圖用...來阻止它

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

...似乎工作正常,但我似乎無法重新啟動它:

loggerContext.start()

這似乎不會重新創建appender。

非常感謝您的幫助。

可以通過重新加載LogBack的配置來重新啟動appender。 在我的情況下,我在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();
}

我有完全相同的問題。 我將記錄器保存為靜態變量,因此必須通過重置保持它們。 解決方案如下:

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沒有初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM