在 Logback 加载配置(并创建日志文件)之前请求权限

Request permission before Logback loads configuration (and creates log file)

我正在使用 Logback for Android 将我的应用程序日志写入外部存储文件。我的应用程序正在 Android M 中执行,因此我需要请求用户允许写入该文件 (WRITE_EXTERNAL_STORAGE)。

但是,当应用程序启动时,Logback 会读取配置文件 (src/main/assets/logback.xml) 并尝试创建日志文件(在本例中,它位于 /sdcard/logback/myapp 目录),然后用户给出的权限,因此它会抛出权限被拒绝的错误。

有什么方法可以告诉 Logback 何时加载日志配置?当用户授予权限时,我需要强制 Logback "reset" 配置,因此它有权创建文件。

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>

我找到了解决办法。在 onRequestPermissionResult 方法中,当用户授予写入外部存储的权限时,我将使用以下代码重新加载 Logback 配置:

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

现在,文件已创建,一切正常。