我在Kotlin项目中使用logback-android在文件中生成日志。我以前在不同的Android版本中测试过这个解决方案,没有任何问题,但是我在Android5.1中发现了一个问题:日志文件的父目录是创建的,而不是日志文件。我该怎么解决这个问题?
build.gradle:
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>发布于 2019-09-07 11:12:32
我建议使用logback__'s https://logback.qos.ch/manual/configuration.html#dumpingStatusData (例如,<configuration debug="true"> in logback.xml__)在logcat中查看有用的消息以进行故障排除。
Android 5.1
logcat消息显示文件名无效。具体来说,Android5.1 在文件名中 (在较晚版本的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、创建文件失败的形式出现。
|-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的file属性中删除冒号,同时注意避免与fileNamePattern发生任何可能的文件名冲突。
<timestamp key="datetime" datePattern="yyyy-MM-dd--HHmmss"/>
<file>${LOG_DIR}/${datetime}.log</file>
...
<fileNamePattern>${LOG_DIR}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>Android 6+
由于在Android 6+中允许在文件名中使用6+,所以我们不需要担心上面提到的文件名冲突。配置可以保持不变。
另外,确保请求用户权限写入外部存储,否则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)在您的示例中,请求权限的代码应该在onCreate() of MainActivity.kt中,然后才会记录任何可能导致写入外部存储的内容:
import android.Manifest
import android.content.pm.PackageManager
import android.support.v4.app.ActivityCompat
import android.support.v4.content.ContextCompat
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 1)
}
logger.info { "hello world" }
}https://stackoverflow.com/questions/55524342
复制相似问题