我对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。
非常感谢您的帮助。
答案 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>
我遇到的问题是:文件追加器没有初始化。