logback android FileAppender未创建文件

logback android FileAppender未创建文件,android,logback,fileappender,Android,Logback,Fileappender,我在Kotlin项目中使用它在文件中生成日志。我以前在不同的Android版本中测试过这个解决方案,没有任何问题,但我在Android 5.1中发现了一个问题:创建了日志文件的父目录,但没有创建日志文件。我该如何解决这个问题 build.gradle: logback.xml: [%d{yyyyymmdd HH:mm:ss}][%thread][%-5level][%logger{36}][%msg]%n ${LOG\u DIR}/${datetime}.LOG [%d{yyyyymmdd H

我在Kotlin项目中使用它在文件中生成日志。我以前在不同的Android版本中测试过这个解决方案,没有任何问题,但我在Android 5.1中发现了一个问题:创建了日志文件的父目录,但没有创建日志文件。我该如何解决这个问题

build.gradle:

logback.xml:


[%d{yyyyymmdd HH:mm:ss}][%thread][%-5level][%logger{36}][%msg]%n
${LOG\u DIR}/${datetime}.LOG
[%d{yyyyymmdd HH:mm:ss}][%thread][%-5level][%logger{36}][%msg]%n
${LOG\u DIR}/%d{yyyy-MM-dd}.%i.LOG
100MB
5.
500MB
我建议使用
logback
(例如
logback.xml
中的
)查看
logcat
中有关疑难解答的有用消息

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


${LOG\u DIR}/${datetime}.LOG
问题将以
FileNotFoundException
的形式出现在
logcat
中,表现为:

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


${LOG\u DIR}/${datetime}.LOG
...
${LOG\u DIR}/%d{yyyy-MM-dd}.%i.LOG
安卓6+ 由于Android 6+中的文件名允许使用
,因此我们不需要担心上面提到的文件名冲突。配置可以保持不变

另外,请确保写入外部存储,否则,
logbackandroid
将无法为目标文件创建任何父目录(并且缺少对文件本身的写入访问)。如果启用了调试,您将看到如下消息:

|-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)
在您的情况下,权限请求代码应该位于
MainActivity.kt的
onCreate()
中,然后再记录任何可能导致写入外部存储器的内容:

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" }
}

你好,欧内斯托·加西亚,欢迎来到Stack Overflow!当你问一个由你的代码引起的问题时,如果你提供人们可以用来重现问题的代码,你会得到更好的答案。请参阅:。祝你好运依赖项问题应在中发布github@ErnestoGarcia你能提供一个复制这个问题的GitHub回购协议的链接吗?谢谢大家,很抱歉这么晚才回答。我认为我在读取日志时发现了错误,显然使用的模式是问题
“yyyy”-“MMdd”-“HH”:“mm”:“ss”
具有字符
,在Android的5.1版本中,这种模式代表了某种问题,我创建了一些示例来重现错误
|-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)
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" }
}