【发布时间】:2016-07-10 08:19:58
【问题描述】:
我正在为 android 使用 logback,并且我在代码中配置它,因为我希望日志目录根据手机动态更改(例如,某些手机有外部存储,我想写入,但其他手机不要这样我们必须重定向到内部存储)。
这是我的配置代码:
File logFilesDir = getLogFilesDir(this);
LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory();
lc.reset();
RollingFileAppender<ILoggingEvent> fileAppender = null;
lc.putProperty("LOG_DIR", logFilesDir.getAbsolutePath());
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(lc);
encoder.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
encoder.start();
File logFile = new File(logFilesDir, "MyApplication.log");
FixedWindowRollingPolicy rollingPolicy = new FixedWindowRollingPolicy();
rollingPolicy.setContext(lc);
rollingPolicy.setFileNamePattern("${LOG_DIR}/MyApplication.%i.log");
rollingPolicy.setMinIndex(1);
rollingPolicy.setMaxIndex(5);
SizeBasedTriggeringPolicy<ILoggingEvent> triggeringPolicy = new SizeBasedTriggeringPolicy<>();
triggeringPolicy.setContext(lc);
triggeringPolicy.setMaxFileSize("1KB"); // for testing; would otherwise be 5MB
fileAppender = new RollingFileAppender<>();
fileAppender.setContext(lc);
fileAppender.setFile(logFile.getAbsolutePath());
fileAppender.setEncoder(encoder);
fileAppender.setRollingPolicy(rollingPolicy);
fileAppender.setTriggeringPolicy(triggeringPolicy);
rollingPolicy.setParent(fileAppender);
fileAppender.start();
rollingPolicy.start();
triggeringPolicy.start();
// add the newly created appenders to the root logger;
// qualify Logger to disambiguate from org.slf4j.Logger
ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
root.addAppender(fileAppender);
root.info("----- Application onCreate -----");
StatusPrinter.print(lc);
日志写入正确的文件夹,一切正常,除非我的日志文件超过最大文件大小(在我的测试用例中为 1KB)它无法翻转。相反,该文件一直在增长。
StatusPrinter.print 写入以下输出,看起来一切正常
|-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [assets/logback.xml]
|-INFO in ch.qos.logback.core.rolling.RollingFileAppender[null] - Active log file name: /storage/emulated/0/MyApplication/logs/MyApplication.log
|-INFO in ch.qos.logback.core.rolling.RollingFileAppender[null] - File property is set to [/storage/emulated/0/MyApplication/logs/MyApplication.log]
|-INFO in ch.qos.logback.core.rolling.FixedWindowRollingPolicy@34b71b53 - No compression will be used
我已经查看了尽可能多的其他类似问题,但通常人们似乎错过了 RollingFileAppender 或没有 WRITE_EXTERNAL_STORAGE 权限...在我看来,我没有遇到任何问题那些案件。我的代码(与人们通常使用的 XML)有什么不同吗?
我能做些什么来解决这个问题或进一步排除故障?
谢谢
【问题讨论】:
-
小心,从
android 6.0你应该总是检查ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)在将文件写入sdcard 之前。如果您无法写入 sdcard,则错误可能来自“在运行时请求权限”:developer.android.com/intl/vi/training/permissions/… -
啊。我在 android 6 上写入外部存储时确实遇到了一些问题,但我还没有解决这个问题。我会解决的。无论如何,这个问题肯定发生在 android 5
标签: android logging logback rollingfileappender