android - 如何使用 2 个进程从 1 个 android-app 登录到 1 个日志文件

标签 android service multiprocessing logback

我使用的应用程序(在 Process1 P1 中运行)在单独的进程(在 Process2 P2 中运行)中启动 Android 服务。

以下是使用 android os >= API 23 时的常见问题,然后必须授予 WRITE_EXTERNAL_STORAGE 权限才能创建日志目录并进行日志记录,这已通过初始化 Logger 上下文解决:

val loggerContext :LoggerContext = LoggerFactory.getILoggerFactory() as LoggerContext
        loggerContext.reset()
        val contextInitializer = ContextInitializer(loggerContext)
        contextInitializer.autoConfig()

我像这样使用 RollingFileAppender:

<appender name="myMultiProcessApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/log.txt</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- Group the logs by day -->
            <fileNamePattern>${LOG_DIR}/log-%d{yyyy-MM-dd}#%i.zip</fileNamePattern>
            <!-- Keeping DAYS_TO_KEEP (defaulting to 5) grouped logs - days in this case -->
            <maxHistory>${DAYS_TO_KEEP:-5}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- Assuming a compression ratio of 50% (very conservative) each compressed file should be less than 2MB -->
                <maxFileSize>${MAX_FILE_SIZE:-4Mb}</maxFileSize>
                <!-- Total Size Cap - this option is not available on logback-android, only on mainstream logback -->
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>[%date{ISO8601}] [%thread] %-5level %logger{36} %M - %msg%n</pattern>
        </encoder>
    </appender>

问题,情况: P1 和 P2 正在使用使用 logback 框架进行日志记录的类,但目前只有 P2 的日志出现在日志文件中! 在 P1 获得所有必要的权限后,P2 将从 P1 开始。

现在问题: 有谁知道,是否可以从 1 个带有 logback 的 Android 应用程序中使用的 2 个独立进程将日志写入 1 个文件? 我是否必须明确授予 P2 的 grand write 权限?

如果是,你能告诉我怎么做吗?

TIA 卢克

最佳答案

回答: 是的,有可能 2 个进程同时写入 1 个日志文件。 我们必须激活 prudent 模式,这需要 3 倍的时间来记录,但在大多数情况下都可以正常工作:

查看文档: documentation for prudent mode in File Appender

谨慎模式有以下限制:

  1. 文件属性中没有文件名。它将以 filenamePattern 的命名开始。 <file></file>
  2. 不支持压缩。 (问题中的示例,但使用 .log 而不是 .zip)<fileNamePattern>${LOG_DIR}/log-%d{yyyy-MM-dd}#%i.log</fileNamePattern>

查看此处了解限制:prudent limitations

关于android - 如何使用 2 个进程从 1 个 android-app 登录到 1 个日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48466348/

相关文章:

java - 如何暂停服务

python - 使用多处理时未在 python 中更新全局变量

python - 在多核上运行 Python

android - 将按钮文本设置为问号

java - 将 url 加载到字符串变量

java - CXF JAXRS - 如何将日期作为 QueryParam 传递

Python 多处理池传递函数参数

android - 是否有适用于 Android 的滚动条组件?

java - Android 上无损 JPG 裁剪且不丢失 EXIF

java - Android中如何在广播接收器被触发之前启动服务?