logback-android文件附加器

时间:2019-04-04 20:24:17

标签: android logback fileappender

我正在使用logback-android库将日志生成到文件中。我在不同的Android版本中测试了该解决方案,没有任何问题。今天,我在Android 5.1中进行了测试,发现创建了包含日志文件的文件夹,但没有创建日志文件。

对不起,我会给你一个更好的背景: 我在带有gradle的Android Kotlin项目中使用logback-android,但存在依赖项:

implementation 'io.github.microutils:kotlin-logging:1.6.24'
implementation 'com.github.tony19:logback-android:2.0.0'

还有我的logback.xml和附加器:

<configuration>
    <property name="LOG_DIR" value="${EXT_DIR:-${DATA_DIR}}/log.log" />
    <timestamp key="datetime" datePattern="yyyy'-'MMdd'-'HH':'mm':'ss"/>
    <appender name="logcat" class="ch.qos.logback.classic.android.LogcatAppender">
        <encoder>
            <pattern>[%d{yyyyMMdd-HH:mm:ss}][%thread][%-5level][%logger{36}][%msg]%n</pattern>
        </encoder>
    </appender>
    <appender name="filelog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/${datetime}.log</file>
        <encoder>
            <pattern>[%d{yyyyMMdd-HH:mm:ss}][%thread][%-5level][%logger{36}][%msg]%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>5</maxHistory>
            <totalSizeCap>500MB</totalSizeCap>
        </rollingPolicy>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="logcat" />
    </root>
    <root level="DEBUG">
        <appender-ref ref="filelog" />
    </root>
</configuration>

我在此处because上发布消息,并且我正在实际项目中使用此解决方案,因此无法与您共享代码,但是如果这些新更新对您来说不够用,也许我可以创建一个假项目并与您共享

1 个答案:

答案 0 :(得分:0)

我建议使用logback的{​​{3}}(例如<configuration debug="true">中的logback.xml)来查看logcat中的有用消息以进行故障排除。 / em>

Android 5.1

logcat消息表明文件名无效。具体来说,是Android 5.1 debug(在更高版本的Android中不是问题):

<timestamp key="datetime" datePattern="yyyy-MM-dd-HH:mm:ss"/> <!-- DON'T USE COLONS IN ANDROID 5.1 -->
<file>${LOG_DIR}/${datetime}.log</file>

问题将在logcat中以FileNotFoundException的形式出现,以disallows : in filenames的形式出现:

|-INFO in ch.qos.logback.core.rolling.RollingFileAppender[filelog] - File property is set to [/storage/sdcard/logfolder/2019-09-07-05:22:42.log]
    java.io.FileNotFoundException: /storage/sdcard/logfolder/2019-09-07-05:22:42.log: open failed: EINVAL (Invalid argument)

...

|-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[filelog] - openFile(/storage/sdcard/logfolder/2019-09-07-05:22:42.log,true) failed
    java.io.FileNotFoundException: /storage/sdcard/logfolder/2019-09-07-05:22:42.log: open failed: EINVAL (Invalid argument)

...

|-WARN in ch.qos.logback.core.rolling.RollingFileAppender[filelog] - Attempted to append to non started appender [filelog].

解决方法是从RollingFileAppender的{​​{1}}属性中删除冒号,同时注意避免与file发生任何文件名冲突。例如:

fileNamePattern

Android 6 +

由于Android 6+中文件名中允许使用<timestamp key="datetime" datePattern="yyyy-MM-dd--HHmmss"/> <file>${LOG_DIR}/${datetime}.log</file> ... <fileNamePattern>${LOG_DIR}/%d{yyyy-MM-dd}.%i.log</fileNamePattern> ,因此我们不必担心上述文件名冲突。配置可以保持不变。

此外,请确保result of FileOutputStream failing to create the file写入外部存储,否则:将无法为目标文件创建任何父目录(并且缺少对文件本身的写访问权限)。如果启用了调试,您将看到logback-android条消息,如下所示:

logcat

在您的情况下,权限请求代码应位于|-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[filelog] - Failed to create parent directories for [/storage/emulated/0/logfolder/2019-09-07-02:27:04.log] |-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[filelog] - openFile(/storage/emulated/0/logfolder/2019-09-07-02:27:04.log,true) failed java.io.FileNotFoundException: /storage/emulated/0/logfolder/2019-09-07-02:27:04.log: open failed: ENOENT (No such file or directory) 的{​​{1}}中,然后记录所有可能导致写入外部存储的内容:

onCreate()