2017-09-22 50 views
0

我使用Logback for Android将我的应用程序的日志写入外部存储文件。我的应用程序正在Android M中执行,因此我需要向用户请求写入该文件的权限(WRITE_EXTERNAL_STORAGE)。Logback加载配置(并创建日志文件)之前的请求权限

然而,当应用程序启动时,的logback读取配置文件(src/main/assets/logback.xml),并尝试创建日志文件(在这种情况下,它位于/sdcard/logback/myapp目录),用户给予该许可之前,所以它抛出一个权限被拒绝错误。

有什么办法告诉Logback何时加载日志记录配置?当用户给予权限时,我需要强制Logback“重置”配置,因此它有权创建该文件。

logback.xml

<configuration> 
    <property name="LOG_DIR" value="/sdcard/logback/myapp"/> 

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <encoder> 
      <pattern>%dateStr [%thread] %-5level %logger{35} - %msg %n</pattern> 
     </encoder> 

     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
      <fileNamePattern>${LOG_DIR}/myapp.%d{yyyy-MM-dd}.log</fileNamePattern> 
      <maxHistory>7</maxHistory> 
     </rollingPolicy> 
    </appender> 

    <appender name="LOGCAT" class="ch.qos.logback.classic.android.LogcatAppender"> 
     <encoder> 
      <pattern>%msg</pattern> 
     </encoder> 
    </appender> 

    <root level="DEBUG"> 
     <appender-ref ref="FILE"/> 
     <appender-ref ref="LOGCAT"/> 
    </root> 

</configuration> 
+1

我会建议你把这个问题放在他们的github问题上。 https://github.com/tony19/logback-android/issues –

+0

谢谢@YamenNassif。我会做的。我发现临时解决方案 –

回答

1

我找到了解决办法。在onRequestPermissionResult方法,当用户给写入外部存储的权限,我重装的logback配置与此代码:

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 
loggerContext.reset(); 
ContextInitializer ci = new ContextInitializer(loggerContext); 
ci.autoConfig(); 

现在,在文件被创建和一切工作正常。

+0

只是出于好奇心,你说'重新加载Logback',但正如你所描述的,我认为你需要在那里发起它。 –

+0

当然可以。但实际上,当应用程序启动时,它会自动初始化,因此无法创建文件(权限被拒绝)。使用此代码,我重新初始化它。 –

+0

我对我的假设是否正确,你会放弃在重置记录器上下文之前做出的所有日志语句......? 如果是,您可以将它们“缓存”在内部sd卡位置,并且在授予外部存储权限后,您可以将位置更改为外部...? – Luke

相关问题