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%nExemple 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.propertiesper 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.xmla la carpetasrc/main/resources. - Configura Logback per utilitzar un
RollingFileAppenderque 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%nControlador:
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
