La gestió de registres i logs és una part essencial del desenvolupament d'aplicacions, especialment en entorns de producció. Els logs proporcionen informació valuosa sobre el comportament de l'aplicació, errors, rendiment i altres aspectes crítics. En aquest tema, aprendrem com gestionar els logs en una aplicació Spring Boot.
Continguts
Introducció a la gestió de logs
Els logs són registres de text que contenen informació sobre els esdeveniments que ocorren dins d'una aplicació. Aquests registres poden incloure missatges d'informació, advertències, errors i altres tipus de missatges que ajuden els desenvolupadors i administradors a entendre el comportament de l'aplicació.
Beneficis de la gestió de logs
- Depuració: Ajuden a identificar i solucionar errors.
- Monitorització: Permeten supervisar el rendiment i l'estat de l'aplicació.
- Auditoria: Proporcionen un registre d'esdeveniments per a la revisió i el compliment normatiu.
- Anàlisi: Faciliten l'anàlisi de tendències i patrons en el comportament de l'aplicació.
Configuració de logs a Spring Boot
Spring Boot utilitza Logback com a sistema de registre per defecte. No obstant això, també es pot configurar per utilitzar altres sistemes de registre com Log4j2 o Java Util Logging (JUL).
Configuració bàsica
Spring Boot proporciona una configuració de registre per defecte que es pot personalitzar mitjançant el fitxer application.properties
o application.yml
.
Exemple de configuració en application.properties
:
# Nivell de registre per defecte logging.level.root=INFO # Nivell de registre per a paquets específics logging.level.org.springframework.web=DEBUG logging.level.com.example.myapp=TRACE # Configuració de la sortida del log logging.file.name=logs/myapp.log logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
Exemple de configuració en application.yml
:
logging: level: root: INFO org.springframework.web: DEBUG com.example.myapp: TRACE file: name: logs/myapp.log pattern: console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
Utilitzant Logback
Logback és el sistema de registre per defecte en Spring Boot. Proporciona una configuració flexible i potent per gestionar els logs.
Fitxer de configuració de Logback
El fitxer de configuració de Logback es pot anomenar logback.xml
i es col·loca a la carpeta src/main/resources
.
Exemple de logback.xml
:
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>logs/myapp.log</file> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root> <logger name="org.springframework.web" level="DEBUG" /> <logger name="com.example.myapp" level="TRACE" /> </configuration>
Nivells de registre
Els nivells de registre determinen la importància dels missatges que es registren. Els nivells comuns són:
- TRACE: El nivell més detallat. Utilitzat per a informació molt fina.
- DEBUG: Informació detallada per a depuració.
- INFO: Informació general sobre el funcionament de l'aplicació.
- WARN: Advertències sobre possibles problemes.
- ERROR: Errors que han ocorregut.
- FATAL: Errors crítics que poden causar la terminació de l'aplicació.
Exemples pràctics
Exemple 1: Registre bàsic
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class LoggingController { private static final Logger logger = LoggerFactory.getLogger(LoggingController.class); @GetMapping("/log") public String logExample() { logger.trace("A TRACE message"); logger.debug("A DEBUG message"); logger.info("An INFO message"); logger.warn("A WARN message"); logger.error("An ERROR message"); return "Check the logs for different levels of messages"; } }
Exemple 2: Configuració avançada de Logback
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/myapp.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root> <logger name="org.springframework.web" level="DEBUG" /> <logger name="com.example.myapp" level="TRACE" /> </configuration>
Exercicis pràctics
Exercici 1: Configuració bàsica de logs
- Crea una nova aplicació Spring Boot.
- Configura els logs utilitzant
application.properties
per registrar missatges a la consola i a un fitxer. - Implementa un controlador que generi missatges de log en diferents nivells (TRACE, DEBUG, INFO, WARN, ERROR).
Exercici 2: Configuració avançada de Logback
- Crea un fitxer
logback.xml
a la carpetasrc/main/resources
. - Configura Logback per utilitzar un
RollingFileAppender
que creï un nou fitxer de log cada dia. - Implementa un controlador que generi missatges de log en diferents nivells i verifica que els logs es registren correctament.
Solucions
Solució a l'Exercici 1
application.properties
:
logging.level.root=INFO logging.level.com.example=DEBUG logging.file.name=logs/myapp.log logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
Controlador:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class LoggingController { private static final Logger logger = LoggerFactory.getLogger(LoggingController.class); @GetMapping("/log") public String logExample() { logger.trace("A TRACE message"); logger.debug("A DEBUG message"); logger.info("An INFO message"); logger.warn("A WARN message"); logger.error("An ERROR message"); return "Check the logs for different levels of messages"; } }
Solució a l'Exercici 2
logback.xml
:
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/myapp.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root> <logger name="org.springframework.web" level="DEBUG" /> <logger name="com.example.myapp" level="TRACE" /> </configuration>
Controlador:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class LoggingController { private static final Logger logger = LoggerFactory.getLogger(LoggingController.class); @GetMapping("/log") public String logExample() { logger.trace("A TRACE message"); logger.debug("A DEBUG message"); logger.info("An INFO message"); logger.warn("A WARN message"); logger.error("An ERROR message"); return "Check the logs for different levels of messages"; } }
Conclusió
La gestió de registres i logs és una part fonamental del desenvolupament d'aplicacions amb Spring Boot. Hem après com configurar els logs utilitzant application.properties
i logback.xml
, així com els diferents nivells de registre i com utilitzar-los en una aplicació. Els exercicis pràctics proporcionen una oportunitat per aplicar aquests conceptes i assegurar-se que els logs es gestionen de manera efectiva en les aplicacions Spring Boot.
Curs de Spring Boot
Mòdul 1: Introducció a Spring Boot
- Què és Spring Boot?
- Configuració del teu entorn de desenvolupament
- Creant la teva primera aplicació Spring Boot
- Entenent l'estructura del projecte Spring Boot
Mòdul 2: Conceptes bàsics de Spring Boot
- Anotacions de Spring Boot
- Injecció de dependències a Spring Boot
- Configuració de Spring Boot
- Propietats de Spring Boot
Mòdul 3: Construint serveis web RESTful
- Introducció als serveis web RESTful
- Creant controladors REST
- Gestionant mètodes HTTP
- Gestió d'excepcions en REST
Mòdul 4: Accés a dades amb Spring Boot
- Introducció a Spring Data JPA
- Configuració de fonts de dades
- Creant entitats JPA
- Utilitzant repositoris de Spring Data
- Mètodes de consulta a Spring Data JPA
Mòdul 5: Seguretat a Spring Boot
- Introducció a Spring Security
- Configuració de Spring Security
- Autenticació i autorització d'usuaris
- Implementant autenticació JWT
Mòdul 6: Proves a Spring Boot
Mòdul 7: Funcions avançades de Spring Boot
Mòdul 8: Desplegant aplicacions Spring Boot
Mòdul 9: Rendiment i monitorització
- Optimització del rendiment
- Monitorització amb Spring Boot Actuator
- Utilitzant Prometheus i Grafana
- Gestió de registres i logs