Logging para Kotlin: melhores soluções
Logging é uma parte essencial do desenvolvimento de qualquer aplicação séria. No ecossistema Kotlin, graças à compatibilidade total com Java e à presença de abordagens modernas de DSL, existem várias soluções testadas. Neste artigo, vamos analisar as melhores bibliotecas para logging em Kotlin: desde frameworks Java clássicos até wrappers especializados em Kotlin. Você aprenderá como configurar um logging eficiente para projetos server-side (Ktor, Spring Boot) e mobile (Android).
1. SLF4J + Logback — escolha clássica
SLF4J (Simple Logging Facade for Java) é uma fachada (abstração) sobre vários frameworks de logging. Em conjunto com Logback (implementação criada pelo mesmo autor), este é o padrão de facto para projetos JVM, incluindo Kotlin.
Características:
- Estabilidade e desempenho comprovados pelo tempo.
- Configuração flexível através de XML ou Groovy/DSL.
- Suporte para logging assíncrono (AsyncAppender).
- Compressão e rotação automáticas de logs.
Exemplo de configuração em Kotlin:
// build.gradle.ktsdependencies { implementation("ch.qos.logback:logback-classic:1.4.14") implementation("org.slf4j:slf4j-api:2.0.9")}
// Main.ktimport org.slf4j.LoggerFactory
private val logger = LoggerFactory.getLogger("MyApp")
fun main() { logger.info("Aplicação iniciada") try { // lógica de negócio } catch (e: Exception) { logger.error("Erro de execução: {}", e.message, e) }}O Logback procura automaticamente o ficheiro logback.xml no classpath. Exemplo de configuração simples:
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender>
<root level="debug"> <appender-ref ref="STDOUT" /> </root></configuration>2. kotlin-logging — wrapper Kotlin leve
A biblioteca kotlin-logging (do autor Marcin Zajączkowski) fornece uma interface Kotlin minimalista sobre o SLF4J. Ela adiciona suporte para expressões lambda e funções inline, o que evita custos indiretos de formatação de strings se o nível de logging estiver desativado.
Vantagens:
- Avaliação preguiçosa de mensagens:
logger.debug { "Complexo ${expensive()}" }. - Não requer declaração manual de
val logger(através do delegadologger()). - Compatibilidade total com qualquer implementação SLF4J (Logback, Log4j2).
Exemplo de uso:
// build.gradle.ktsdependencies { implementation("io.github.microutils:kotlin-logging-jvm:3.0.5")}
// Main.ktimport mu.KotlinLogging
private val logger = KotlinLogging.logger {}
fun main() { val userId = 42 logger.info { "Utilizador $userId entrou no sistema" } logger.debug { "Relatório detalhado: ${generateReport()}" } // não será executado se debug estiver desativado}
fun generateReport(): String = "relatório muito longo"3. Timber — para desenvolvimento Android
Timber é uma biblioteca leve de Jake Wharton, criada especificamente para Android. Ela estende o android.util.Log padrão, adicionando deteção automática de classe, stack traces e a capacidade de "plantar" árvores (trees) para diferentes níveis de logging.
Características principais:
- Tag automática (nome da classe) — não é necessário escrever
Log.d(TAG, ...). - Possibilidade de desativar logs em builds de release com uma única linha.
- Suporte para crash reports e árvores personalizadas (ex.: CrashlyticsTree).
Também na biblioteca
Validação de dados em Swift (iOS/macOS): bibliotecas e abordagens
Respect/Validation para PHP: guia completo com exemplos práticos
Processamento JSON em Swift: Codable, JSONSerialization e exemplos práticos