В моем приложении 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
}
}