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

  1. Crea una nova aplicació Spring Boot.
  2. Configura els logs utilitzant application.properties per registrar missatges a la consola i a un fitxer.
  3. Implementa un controlador que generi missatges de log en diferents nivells (TRACE, DEBUG, INFO, WARN, ERROR).

Exercici 2: Configuració avançada de Logback

  1. Crea un fitxer logback.xml a la carpeta src/main/resources.
  2. Configura Logback per utilitzar un RollingFileAppender que creï un nou fitxer de log cada dia.
  3. 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

Mòdul 2: Conceptes bàsics de Spring Boot

Mòdul 3: Construint serveis web RESTful

Mòdul 4: Accés a dades amb Spring Boot

Mòdul 5: Seguretat a Spring Boot

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ó

Mòdul 10: Millors pràctiques i consells

© Copyright 2024. Tots els drets reservats