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.FileAppender log4j.appender.FILE.File=./main.log log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.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.ConsoleAppender log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.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 CONSOLE log4j.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.