Logging em aplicações Kotlin: melhores práticas para iniciantes
\n\nLogging não é apenas gravar mensagens em um arquivo. É um sistema que ajuda o desenvolvedor a entender o que está acontecendo na aplicação em tempo real, encontrar erros rapidamente e analisar o comportamento dos usuários. Neste artigo, vamos abordar como organizar corretamente o logging em aplicações Kotlin, quais bibliotecas usar e quais erros evitar.
\n\nPor que o logging é necessário?
\nO logging resolve várias tarefas principais:
\n- \n
- Depuração: permite ver a sequência de chamadas e os valores das variáveis sem usar um depurador. \n
- Monitoramento: ajuda a acompanhar o estado da aplicação em ambiente de produção. \n
- Auditoria: registra ações dos usuários e eventos do sistema. \n
- Desempenho: com logs, é possível identificar gargalos e atrasos. \n
Bibliotecas populares para logging em Kotlin
\nNo ecossistema Kotlin e JVM, existem várias soluções consolidadas. Vamos ver as principais:
\n- \n
- SLF4J (Simple Logging Facade for Java) — uma fachada que não implementa o logging em si, mas fornece uma API unificada para diferentes implementações (Logback, Log4j2, etc.). \n
- Logback — a implementação mais popular do SLF4J. Rápida, flexível, com suporte a arquivos rotativos. \n
- Log4j 2 — uma biblioteca poderosa com suporte a logging assíncrono e filtragem. \n
- Kotlin Logging — um wrapper conveniente sobre o SLF4J, usando funções inline para minimizar a sobrecarga. \n
Configuração do Logback em um projeto Kotlin
\nVamos ver a configuração passo a passo do Logback — a solução mais popular para aplicações Kotlin/JVM.
\n\nPasso 1. Adicionar dependências
\nNo arquivo build.gradle.kts, adicione:
dependencies {\n implementation("ch.qos.logback:logback-classic:1.4.14")\n implementation("io.github.microutils:kotlin-logging-jvm:3.0.5")\n}\n\nPasso 2. Criar o arquivo de configuração
\nCrie o arquivo src/main/resources/logback.xml:
<configuration>\n <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">\n <encoder>\n <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>\n </encoder>\n </appender>\n\n <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">\n <file>logs/app.log</file>\n <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">\n <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>\n <maxHistory>30</maxHistory>\n </rollingPolicy>\n <encoder>\n <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>\n </encoder>\n </appender>\n\n <root level="INFO">\n <appender-ref ref="CONSOLE"/>\n <appender-ref ref="FILE"/>\n </root>\n</configuration>\nEsta configuração exibe os logs no console e em um arquivo com rotação diária (os logs são mantidos por 30 dias).
\n\nPasso 3. Uso no código
\nVamos usar a biblioteca kotlin-logging:
\nimport mu.KotlinLogging\n\nprivate val logger = KotlinLogging.logger {}\n\nfun main() {\n logger.info("Aplicação iniciada")\n logger.debug { "Valor da variável x = $x" }\n try {\n // algum código\n } catch (e: Exception) {\n logger.error(e) { "Erro ao executar a operação" }\n }\n}\n\nNíveis de logging: quando usar cada um
\nA escolha correta do nível é a base para logs legíveis. No Logback, os seguintes níveis estão disponíveis