2017-09-22 1 views
0

Logback for Android을 사용하여 외부 저장소 파일에 내 앱 로그를 기록합니다. 내 앱이 Android M에서 실행 중이므로 사용자에게 해당 파일에 쓰기 권한 (WRITE_EXTERNAL_STORAGE)을 요청해야합니다. 응용 프로그램이 실행될 때Logback이 구성을로드하고 로그 파일을 생성하기 전에 사용 권한 요청

그러나, Logback은 사용자가 해당에 대한 권한을 부여하기 전에 그것은을 발생하므로, (가 /sdcard/logback/myapp 디렉토리에 위치하고,이 경우) 설정 파일 (src/main/assets/logback.xml)을 읽고 로그 파일을 만들려고 권한 거부 오류.

로깅 구성을로드 할 때 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

Logger Context를 재설정하기 전에 작성한 모든 로그 문을 잃어 버리게 될 것이라고 가정합니다. 그렇다면 내부 SD 카드 위치에 "캐시"할 수 있으며 외부 저장소에 부여 된 권한을 부여한 후에 위치를 외부로 변경할 수 있습니다 ...? – Luke

관련 문제