Registro de Spring Boot

El registro es una parte importante de todas las aplicaciones y nos beneficia no solo a nosotros, los desarrolladores, sino también a los usuarios y mantenedores del sistema. Las aplicaciones Spring Boot necesitan recopilar datos de registro relevantes para ayudarnos a diagnosticar y solucionar problemas y medir el rendimiento empresarial.

El marco Spring Boot está preconfigurado con Logback como implementación predeterminada en su enfoque "competente" para Spring Framework. Este artículo explora varias formas de configurar el registro en Spring Boot.

 Código de muestra

Este artículo va acompañado de un código de trabajo de muestra  en GitHub  .

Por que es importante llevar un diario

Las decisiones sobre qué y dónde iniciar sesión suelen ser estratégicas y se toman con el supuesto de que una aplicación podría no funcionar correctamente en entornos del mundo real. Los registros desempeñan un papel clave para ayudar a una aplicación a recuperarse rápidamente de dichos bloqueos y reanudar el funcionamiento normal.

Hacer visibles los errores en los puntos de integración

La naturaleza distribuida de las aplicaciones actuales creadas con una arquitectura de microservicio presenta muchas piezas de trabajo. Por lo tanto, naturalmente, puede tener problemas debido a fallas temporales en cualquiera de los sistemas de infraestructura.

Los registros de excepciones registrados en los puntos de integración nos permiten identificar la causa raíz de una interrupción y nos permiten tomar las medidas adecuadas para recuperarnos con un impacto mínimo en la experiencia del usuario final.

Diagnóstico de errores funcionales en el sistema de producción.

Puede haber quejas de clientes sobre el monto de transacción incorrecto. Para diagnosticar esto, necesitamos profundizar en nuestros registros para encontrar la secuencia de operaciones desde los datos de la solicitud cuando se llama a la API hasta los datos de respuesta al final de la API de procesamiento.

Análisis del historial de eventos

.  , .

, , , .

, , , , .  CI / CD.

Spring Boot

Spring Boot - Logback .

, Spring Boot.  -,  start.spring.io .  :

@SpringBootApplication
public class SpringLoggerApplication {
    static final Logger log = 
        LoggerFactory.getLogger(SpringLoggerApplication.class);
  
    public static void main(String[] args) {
     log.info("Before Starting application");
     SpringApplication.run(SpringLoggerApplication.class, args);
     log.debug("Starting my application in debug with {} args", args.length);
     log.info("Starting my application with {} args.", args.length);  
    }
  }

Maven Gradle jar , :

13:21:45.673 [main] INFO io.pratik.springLogger.SpringLoggerApplication - Before Starting application

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.2.RELEASE)
.
.
.
... : Started SpringLoggerApplication in 3.054 seconds (JVM running for 3.726)
... : Starting my application 0

, Spring, .  .

Spring Boot     .

 application.propertiesapplication.yml), .

.  .

java -jar target/springLogger-0.0.1-SNAPSHOT.jar --trace

, , , .

, , Spring.  ,  log.level.<package-name>:

java \\
  -jar target/springLogger-0.0.1-SNAPSHOT.jar \\
  -Dlogging.level.org.springframework=ERROR \\
  -Dlogging.level.io.pratik=TRACE

 application.properties:

logging.level.org.springframework=ERROR 
logging.level.io.app=TRACE

,  logging.file.name logging.file.path  application.properties.  info.

# Output to a file named application.log. 
logging.file.name=application.log
# Output to a file named spring.log in path /Users
logging.file.path=/Users

,  logging.file.name .

, Spring 2.2 , .  2.3.2.RELEASE.

,  logging.pattern.file:

# Logging pattern for file
logging.pattern.file= %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%

, :

,

logging.file.max-size

10 Mb

logging.file.max-history

7

logging.file.total-size-cap

.  , .

logging.file.clean-history-on-start

, .

Spring .  , off  application.properties:

spring.main.banner-mode=off 

ANSI,  spring.output.ansi.enabled.  : , .

spring.output.ansi.enabled=ALWAYS

    spring.output.ansi.enabled DETECT.  , ANSI.

Logback  Spring Boot .  log4j java util, spring-boot-starter-loging  pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

 logback-spring.xml

,  logback.xml logback-spring.xml XML . Spring  logback-spring.xmllogback-spring.groovy .

 appender  configuration.   encoder:

<configuration >
  <include
    resource="/org/springframework/boot/logging/logback/base.xml" />
  <appender name="STDOUT"
    class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
      </pattern>
    </encoder>
  </appender>
</configuration>

Logback

 debug  configuration  true, .

<configuration debug="true">

, Logback, :

...- About to instantiate appender of type [...ConsoleAppender]
...- About to instantiate appender of type [...RollingFileAppender]
..SizeAndTimeBasedRollingPolicy.. - setting totalSizeCap to 0 Bytes
..SizeAndTimeBasedRollingPolicy.. - ..limited to [10 MB] each.
..SizeAndTimeBasedRollingPolicy.. Will use gz compression
..SizeAndTimeBasedRollingPolicy..use the pattern /var/folders/
..RootLoggerAction - Setting level of ROOT logger to INFO

, , .

,  logback-spring.xml. ,   ​​   .

.  Spring Boot , .  , Logstash:

  <appender name="LOGSTASH"
    class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>localhost:4560</destination>
    <encoder charset="UTF-8"
      class="net.logstash.logback.encoder.LogstashEncoder" />
  </appender>

 LogstashEncoder JSON  localhost:4560.  .

.  Spring - .        .

Lombok

, : Lombok, Slf4j :

@Service
@Slf4j
public class UserService {
  public String getUser(final String userID) {
    log.info("Service: Fetching user with id {}", userID);
  }
}

En este artículo, vimos cómo usar el registro en Spring Boot y cómo personalizarlo de acuerdo con nuestros requisitos. Pero para aprovechar al máximo los beneficios, las capacidades de registro del marco deben complementarse con prácticas de registro sólidas y estandarizadas en todos sus equipos de desarrollo.

Estas técnicas también deberán implementarse mediante una combinación de revisión por pares y herramientas de control de calidad de código automatizadas. En conjunto, esto asegura que cuando ocurran errores de producción, tengamos tanta información como sea posible para diagnosticar.

Puede encontrar todo el código fuente utilizado en el artículo sobre  Github  .




All Articles