Простая библиотека для использования log4j2 на Android. Позволяет выводить лог в Logcat и в файл.
Для инициализации добавьте в Application::onCreate
Log4j2Android.init(this.applicationContext, R.raw.log4j2_config) Конфиг логгера описывается с помощью подобного res/raw/log4j2_config.xml. Подробнее о конфигурации здесь
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="debug"> <Appenders> <Logcat name="Logcat"> <ThresholdFilter level="ALL" onMatch="ACCEPT" onMismatch="DENY" /> <PatternLayout pattern="%m" /> </Logcat> <RollingFile name="RollingFile" fileName="${logsdirpathlookup:internaldir}/com.exapmple.app.log" filePattern="${logsdirpathlookup:internaldir}/com.example.app-%i.log.zip"> <ThresholdFilter level="ALL" onMatch="ACCEPT" onMismatch="DENY" /> <PatternLayout> <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> </PatternLayout> <Policies> <SizeBasedTriggeringPolicy size="1 MB" /> </Policies> <DefaultRolloverStrategy max="5" /> </RollingFile> </Appenders> <Loggers> <Root level="ERROR"> <AppenderRef ref="Logcat" /> <AppenderRef ref="RollingFile" /> </Root> </Loggers> </Configuration> С помощью ${logsdirpathlookup:externaldir} можно указать путь applicationContext.getExternalFilesDir() или с помощью ${logsdirpathlookup:internaldir} путь applicationContext.filesDir
Для работы библиотеки используется форк log4j2:2.3, в котором, для корректной работы на Android, удалена зависимость от java.lang.management.ManagementFactory в org.apache.logging.log4j.core.lookup.JmxRuntimeInputArgumentsLookup. На Android нельзя использовать jmx, поэтому это изменение никак не повлияет на работу логгера. По какой-то причине log4j2.disable.jmx=true перестало работать для Android с API>=26
Добавьте репозиторий с форком и библиотекой в build.gradle.kts
maven { setUrl("https://dl.bintray.com/roman-mityukov/android") } Можно использовать библиотеку через фасад slf4j (что позволит легко заменить логгер при необходимости, например на logback). Для этого нужно добавить следующие зависимости
implementation("org.slf4j:slf4j-api:1.7.25") //simple logging facade for java implementation("org.apache.logging.log4j:log4j-slf4j-impl:2.3") //bridge from log4j2 to slf4j implementation("io.rm.log4j2.android:log4j2-android:1.0.0") //this library annotationProcessor("org.apache.logging.log4j:log4j-core:2.3") И в коде создать логгер с помощью slf4j api
import org.slf4j.Logger import org.slf4j.LoggerFactory val logger: Logger = LoggerFactory.getLogger("MyLoggerName") Или можно использовать api log4j2 напрямую
dependencies { implementation("org.apache.logging.log4j:log4j-api:2.3") implementation("io.rm.log4j2.android:log4j2-android:1.0.0") } Создать логгер
import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.Logger val logger: Logger = LogManager.getLogger("MyLoggerName")