【问题标题】:Reset Logback Appender重置 Logback Appender
【发布时间】:2015-08-16 00:41:00
【问题描述】:

我有一个关于 Logback 的问题。

短版

如果附加程序的创建失败(例如权限被拒绝),当权限问题得到解决时,我如何明确地重新尝试创建它。我正在使用 XML 配置。我想在不重新启动流程的情况下执行此操作。

加长版

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

我正在登录到外部存储上的一个目录,这意味着如果用户将设备连接到 PC 并启用大容量存储,则该目录的文件系统将被卸载。

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

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

...当我的类被类加载器加载并失败时,Logback 无论如何都会尝试创建附加器。

由于 Android 的工作原理,即使用户离开我的应用程序的所有屏幕(例如转到主屏幕),应用程序进程也会继续运行,因此永远不会重新尝试创建附加程序。

有没有办法从配置中重置附加程序?如果是这样,只要用户进入我的应用程序的初始屏幕,我就可以在必要时尝试重置 Logback。

我试图用 ... 阻止它

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

...这似乎工作正常,但我似乎无法重新启动它:

loggerContext.start()

这似乎不会重新创建附加程序。

非常感谢您的帮助。

【问题讨论】:

    标签: java android logback appender


    【解决方案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();
    }
    

    【讨论】:

      【解决方案2】:

      我遇到了完全相同的问题。我将记录器保留为静态变量,因此必须通过重置来保持它们。解决方法如下:

      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>
      

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

      【讨论】:

        猜你喜欢
        • 2014-07-31
        • 1970-01-01
        • 1970-01-01
        • 2015-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多