Personalización de Logging en Consola para Spring Boot
Contexto
La salida de logs por defecto en Spring Boot incluye información redundante —corchetes vacíos, formatos de fecha verbose— que dificulta la lectura rápida durante desarrollo. Personalizar el patrón mejora la experiencia y facilita identificar información relevante.
Objetivo
Configurar un formato de log limpio y útil para consola que elimine elementos innecesarios, simplifique la fecha y preserve lo esencial: nivel, logger y mensaje.
Alcance
Incluye
- Configuración de patrones en
application.properties/application.yml. - Eliminación de corchetes y elementos redundantes.
- Formato de fecha personalizado.
- Colores ANSI para legibilidad.
- Configuración por perfiles (
dev,prod).
No incluye
- Logging a archivo (rolling, rotación).
- Logging distribuido (ELK, Loki, Graylog).
- Cambios dinámicos de nivel en runtime.
Detalle
Configuración Básica
Opción 1 — application.properties
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n
Opción 2 — application.yml (recomendado)
logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"
Formato Optimizado
Formato ISO-8601 sin milisegundos y sin corchetes vacíos:
logging.pattern.console=%d{yyyy-MM-dd'T'HH:mm:ss} %-5level %logger{36} - %msg%n
Componentes del Patrón
| Patrón | Descripción | Ejemplo |
|---|---|---|
%d{...} | Fecha con formato personalizado | 2024-01-15T10:30:45 |
%-5level | Nivel alineado a 5 caracteres a la izquierda | INFO, ERROR |
%logger{36} | Nombre del logger truncado a 36 caracteres | c.m.a.s.UserService |
%msg / %m | Mensaje del log | Usuario creado: 123 |
%n | Nueva línea (multiplataforma) | — |
%thread / %t | Nombre del hilo | main |
%X{...} | Valor de MDC | traceId=abc123 |
Configuración con Colores
spring.output.ansi.enabled=ALWAYS
logging.pattern.console=%clr(%d{yyyy-MM-dd'T'HH:mm:ss}){blue} %clr(%-5p) %clr(---){faint} %clr(%logger{36}){cyan} %clr(:){red} %clr(%m){faint}%n
Colores Disponibles
| Color | Uso recomendado |
|---|---|
blue | Timestamp |
green | Nivel INFO |
yellow | Nivel WARN |
red | Nivel ERROR / separadores críticos |
cyan | Nombre del logger |
magenta | Hilos / contexto |
faint | Separadores y elementos decorativos |
Spring Boot colorea automáticamente
%clr(%-5p)según el nivel cuandospring.output.ansi.enabled=ALWAYS.
Ejemplos de Salida
Formato por defecto (verbose):
2024-01-15 10:30:45.123 INFO 12345 --- [ main] c.m.a.service.UserService : Usuario creado: 123
Formato personalizado limpio:
2024-01-15T10:30:45 INFO com.myapp.service.UserService - Usuario creado: 123
Formato con colores (ilustrativo):
[azul]2024-01-15T10:30:45[/] [verde]INFO [/] [tenue]---[/] [cian]c.m.a.s.UserService[/] [rojo]:[/] [tenue]Usuario creado: 123[/]
Configuración por Perfiles
# application.yml
spring:
profiles:
active: dev
---
spring:
config:
activate:
on-profile: dev
output:
ansi:
enabled: ALWAYS
logging:
pattern:
console: "%clr(%d{HH:mm:ss.SSS}){blue} %clr(%-5p) %clr(%logger{20}){cyan} - %msg%n"
level:
root: DEBUG
com.myapp: TRACE
---
spring:
config:
activate:
on-profile: prod
output:
ansi:
enabled: NEVER
logging:
pattern:
console: "%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} %-5level [%X{traceId:-}] %logger{36} - %msg%n"
level:
root: WARN
com.myapp: INFO
MDC para Trazabilidad
Incluir traceId / spanId en el patrón facilita correlación de requests:
logging.pattern.console=%d{yyyy-MM-dd'T'HH:mm:ss} %-5level [%X{traceId:-},%X{spanId:-}] %logger{36} - %msg%n
Decisiones
- Formato ISO-8601
yyyy-MM-dd'T'HH:mm:ss: sin milisegundos en desarrollo para reducir ruido. application.ymlsobre.properties: jerárquico y más legible.- Colores solo en desarrollo: se desactivan en producción para evitar caracteres ANSI en pipelines de logs.
%-5levelcon alineación izquierda: consistencia visual independiente del nivel.%logger{36}: balance entre contexto útil y concisión.- Perfiles separados (
dev/prod): distinto nivel de verbosidad y formato según entorno.
Pendientes
- Configurar logging estructurado en JSON para integración con ELK / Loki.
- Implementar MDC con
traceIdpor request (filtro Servlet / interceptor). - Evaluar Log4j2 vs. Logback para escenarios de alto throughput.
- Documentar rotación de logs en producción (archivo + tamaño/tiempo).