Logs em Java/Kotlin com Log4J 1.2

A biblioteca mais usada para fazer logs no Java é o Log4J 1.2, ultima versão de 2012. Há uma nova versão chamada Log4J 2, entretanto muitas bibliotecas ainda usam a versão antiga.

Para incluir o Log4J no seu projeto, aqui vai o endereço dele no Maven Repository.

Você pode configurar o comportamento do Logger de duas maneiras. Também conto os prós e contras de cada um:

  • Arquivo log4j.properties
    É fácil e rápido de configurar. Vale a pena usar quando você sabe exatamente quantos arquivos de logger serão criados já de antemão, antes do software iniciar.
  • Programaticamente, dentro do próprio código.
    Vale a pena usar quando você quer criar loggers e arquivos dinamicamente, criando arquivos diferentes para instâncias diferents de objetos no seu programa, por exemplo.

Exemplo de arquivo log4j.properties (você precisa colocálo dentro de /seu-projeto/src/main/resources/)

# Criando a função appender chamada FILE, que escreverá o log em um arquivo no caminho definido abaixo, com as seguintes configurações:log4j.appender.FILE=org.apache.log4j.FileAppenderlog4j.appender.FILE.File=./main.loglog4j.appender.FILE.layout=org.apache.log4j.PatternLayoutlog4j.appender.FILE.layout.ConversionPattern=%d{ISO8601} T[%t] {%c} (%p)%x - %m%n# Criando a função appender chamada CONSOLE, que escreverá o log no console da aplicação, com as seguintes configurações:log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderlog4j.appender.CONSOLE.Target=System.outlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayoutlog4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} T[%t] {%c} (%p)%x - %m%n# Configurando o RootLooger, que aplicará essas configurações a todas os logs chamados pelo software.# O RootLogger enviará mensagens até o nível DEBUG# E escreverá o log em arquivo e também no console através dos appenders configurados anteriormente chamados FILE e CONSOLElog4j.rootLogger = DEBUG, FILE, CONSOLE

Exemplo de configuração do logger no Kotlin:

import org.apache.log4j.*fun main() {    val rootLogger = Logger.getRootLogger()    val loggerLayout = PatternLayout("%d{ISO8601} T[%t] C[%c] {%p} %x- %m%n")    val consoleAppender = ConsoleAppender(loggerLayout)    val fileAppender = RollingFileAppender(        loggerLayout,        "./logs/meu-log.log",    )    fileAppender.maximumFileSize = 10485760L // 10Mb    fileAppender.maxBackupIndex = 4    rootLogger.addAppender(fileAppender)    rootLogger.addAppender(consoleAppender)    val meuLogger = Logger.getLogger("MeuLoggerCustomizado")    meuLogger.addAppender(fileAppender)    meuLogger.addAppender(consoleAppender)}

Controlando Loggers de Bibliotecas externas

Algumas bibliotecas vêm com loggers embutidos (HikariCP, Driver do Apache Cassandra...)

Com o Log4J você consegue redirecionar e controlar as mensagens lançadas por eles. Para isso, você precisa inserir uma biblioteca do tipo "logger binder". Para o HikariCP e o Cassandra, basta usar a biblioteca slf4j-log4j12. Ao incluí-la no projeto você já consegue controlar o logger destas bibliotecas.

You should also read:

Testes em Java/Kotlin

Exemplo completo de testes com Gradle, Kotlin e JUnit5 https://www.petrikainulainen.net/programming/testing/running-kotlin-tests-with-gradle/ Exemplo simples de teste no Java/Kotlin do Android com JUnit4, Mockito ou Robolectric…