Logback Android - файл на процесс - PullRequest
0 голосов
/ 23 марта 2020

В моем приложении Android есть многопроцессная архитектура. Основной процесс содержит пользовательский интерфейс, и у меня есть еще два процесса со службами переднего плана, которые работают 24/7.

Application
|-main (process 1)
|-service 1 (process 2)
|-service 2 (process 3)

Logback работает нормально, но все сохраняется в одном файле. Я хочу иметь отдельный файл для каждого процесса. Я искал по inte rnet и StackOverflow, и нет результатов со словами android, logback и process. Возможно ли достичь этой цели?

Мой logback.xml файл выглядит следующим образом:

<configuration>
    <property name="LOG_DIR" value="${DATA_DIR}/logs" />

    <appender name="logcat" class="ch.qos.logback.classic.android.LogcatAppender">
        <tagEncoder>
            <pattern>%logger{12}</pattern>
        </tagEncoder>
        <encoder >
            <pattern>[%-20thread] %msg</pattern>
        </encoder>
    </appender>

    <appender name="roll" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        <file>${LOG_DIR}/log.txt</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/log.%d{dd-MM-yyyy}.txt
            </fileNamePattern>
            <maxHistory>100</maxHistory>
        </rollingPolicy>
        <encoder class="my_app.logging.ExtendedPatternLayoutEncoder">
            <pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} PID:%process_id [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="logcat" />
        <appender-ref ref="roll" />
    </root>
</configuration>

Для чтения process_id я использую следующие кодеры:

import ch.qos.logback.classic.PatternLayout
import ch.qos.logback.classic.encoder.PatternLayoutEncoder

class ExtendedPatternLayoutEncoder : PatternLayoutEncoder() {
    override fun start() {
        PatternLayout.defaultConverterMap["process_id"] = ProcessIdConverter::class.java.name
        super.start()
    }
}

class ProcessIdConverter : ClassicConverter() {
    companion object {
        private val PROCESS_ID: String = android.os.Process.myPid().toString()
    }

    override fun convert(event: ILoggingEvent): String {
        return PROCESS_ID
    }
}
...