Registro en aplicaciones Kotlin: mejores prácticas para principiantes
\n\nEl registro no es solo escribir mensajes en un archivo. Es un sistema que ayuda al desarrollador a entender lo que sucede en la aplicación en tiempo real, encontrar errores rápidamente y analizar el comportamiento de los usuarios. En este artículo, analizaremos cómo organizar correctamente el registro en aplicaciones Kotlin, qué bibliotecas usar y qué errores evitar.
\n\n¿Por qué es necesario el registro?
\nEl registro resuelve varias tareas clave:
\n- \n
- Depuración: permite ver la secuencia de llamadas y los valores de las variables sin usar un depurador. \n
- Monitoreo: ayuda a rastrear el estado de la aplicación en el entorno de producción. \n
- Auditoría: registra las acciones de los usuarios y los eventos del sistema. \n
- Rendimiento: con los logs se pueden identificar cuellos de botella y retrasos. \n
Bibliotecas populares para registro en Kotlin
\nEn el ecosistema de Kotlin y JVM existen varias soluciones probadas. Veamos las principales:
\n- \n
- SLF4J (Simple Logging Facade for Java) — una fachada que no implementa el registro por sí misma, pero proporciona una API unificada para diferentes implementaciones (Logback, Log4j2, etc.). \n
- Logback — la implementación más popular de SLF4J. Rápida, flexible, con soporte para archivos rotativos. \n
- Log4j 2 — una biblioteca potente con soporte para registro asíncrono y filtrado. \n
- Kotlin Logging — un envoltorio conveniente sobre SLF4J que utiliza funciones inline para minimizar la sobrecarga. \n
Configuración de Logback en un proyecto Kotlin
\nVeamos la configuración paso a paso de Logback, la solución más popular para aplicaciones Kotlin/JVM.
\n\nPaso 1. Agregar dependencias
\nEn el archivo build.gradle.kts agregue:
dependencies {\n implementation("ch.qos.logback:logback-classic:1.4.14")\n implementation("io.github.microutils:kotlin-logging-jvm:3.0.5")\n}\n\nPaso 2. Crear el archivo de configuración
\nCree el archivo 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 configuración envía los logs a la consola y a un archivo con rotación diaria (los logs se conservan durante 30 días).
\n\nPaso 3. Uso en el código
\nUsaremos la biblioteca kotlin-logging:
\nimport mu.KotlinLogging\n\nprivate val logger = KotlinLogging.logger {}\n\nfun main() {\n logger.info("Aplicación iniciada")\n logger.debug { "Valor de la variable x = $x" }\n try {\n // algún código\n } catch (e: Exception) {\n logger.error(e) { "Error al ejecutar la operación" }\n }\n}\n\nNiveles de registro: cuándo usar cada uno
\nLa elección correcta del nivel es la base de logs legibles. En Logback están disponibles los siguientes niveles