重置Logback Appender

时间:2015-08-16 00:41:00

标签: java android 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。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

重新启动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 :(得分: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>

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