重置Logback Appender

4

我有一个关于Logback的问题。

简短版本

如果创建一个appender失败(例如权限被拒绝),当权限问题解决后,我如何显式重新尝试创建它。 我正在使用XML配置。 我希望这样做而不重新启动进程。

较长版本

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

我将日志记录到外部存储器上的目录中,这意味着如果用户连接设备并启用了大容量存储,则该目录的文件系统将被卸载。

如果目录不可用时启动应用程序,我会通知用户,但由于记录器被定义为静态字段...

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。
非常感谢您的帮助。
2个回答

2
重新启动appender可以通过重新加载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();
}

1

我曾经遇到过完全相同的问题。由于我将记录器作为静态变量保留,因此必须在重置时保留它们。解决方案如下:

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>

我遇到的问题是:文件追加器未初始化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接