Journalisation Spring Boot

La journalisation est une partie importante de toutes les applications et profite non seulement à nous, les développeurs, mais également aux utilisateurs et aux mainteneurs du système. Les applications Spring Boot doivent collecter des données de journal pertinentes pour nous aider à diagnostiquer et à résoudre les problèmes et à mesurer les performances de l'entreprise.

Le framework Spring Boot est préconfiguré avec Logback comme implémentation par défaut dans son approche "compétente" du Framework Spring. Cet article explore différentes façons de configurer la journalisation dans Spring Boot.

 Exemple de code

Cet article est accompagné d'un exemple de code de travail  sur GitHub  .

Pourquoi la journalisation est importante

Les décisions sur ce qu'il faut et où enregistrer sont souvent stratégiques et sont prises en supposant qu'une application pourrait ne pas fonctionner correctement dans des environnements réels. Les journaux jouent un rôle clé pour aider une application à se remettre rapidement de ces plantages et à reprendre son fonctionnement normal.

Rendre les erreurs visibles aux points d'intégration

La nature distribuée des applications d'aujourd'hui construites à l'aide d'une architecture de microservice introduit de nombreuses tâches. Ainsi, naturellement, vous pouvez rencontrer des problèmes dus à des pannes temporaires dans l'un des systèmes d'infrastructure.

Les journaux d'exceptions enregistrés aux points d'intégration nous permettent d'identifier la cause première d'une interruption et nous permettent de prendre les mesures appropriées pour récupérer avec un impact minimal sur l'expérience de l'utilisateur final.

Diagnostic des erreurs fonctionnelles dans le système de production

Des clients peuvent se plaindre d'un montant de transaction incorrect. Pour diagnostiquer cela, nous devons explorer nos journaux pour trouver la séquence d'opérations à partir des données de demande lorsque l'API est appelée vers les données de réponse à la fin de l'API de traitement.

Analyse de l'historique des événements

.  , .

, , , .

, , , , .  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);
  }
}

Dans cet article, nous avons vu comment utiliser la journalisation dans Spring Boot et comment la personnaliser en fonction de nos besoins. Mais pour tirer pleinement parti des avantages, les capacités de journalisation du framework doivent être complétées par des pratiques de journalisation robustes et standardisées au sein de vos équipes de développement.

Ces techniques devront également être mises en œuvre au moyen d'une combinaison d'outils d'examen par les pairs et d'outils automatisés de contrôle de la qualité du code. Ensemble, cela garantit que lorsque des erreurs de production se produisent, nous avons autant d'informations que possible à diagnostiquer.

Vous pouvez retrouver tout le code source utilisé dans l'article sur  Github  .




All Articles