Maison  >  Article  >  développement back-end  >  Pratique du cadre de journalisation Spring Boot - partage technique de hansonwang99

Pratique du cadre de journalisation Spring Boot - partage technique de hansonwang99

不言
不言original
2018-05-05 15:11:491886parcourir

Cet article partage principalement avec vous la pratique du framework de journalisation Spring Boot. La partie code est également très détaillée. Les amis dans le besoin peuvent s'y référer.


Vue d'ensemble

Dans les applications Java, les journaux sont généralement divisés selon les 5 niveaux suivants :

  • Message d'erreur ERREUR

  • Message d'avertissement WARN

  • INFO informations générales

  • Informations de débogage DEBUG

  • Informations de suivi TRACE

Spring Boot utilise Apache Commons Logging comme cadre de journalisation interne, qui n'est qu'une interface de journalisation , dans les applications réelles, il est nécessaire de spécifier l'implémentation de journal correspondante pour cette interface.

L'implémentation de journalisation par défaut de SpringBt est Java Util Logging, qui est le package de journalisation fourni avec le JDK. De plus, SpringBt prend bien sûr également en charge les implémentations de journalisation populaires telles que Log4J et Logback.

Unifiez les implémentations de journaux ci-dessus en tant que cadre de journalisation

Pratirons-le !


Utilisez le plug-in Spring Boot Logging

  • Ajoutez d'abord la configuration au fichier application.properties :

logging.level.root=INFO
  • Le code de pièce du contrôleur est le suivant :

package com.hansonwang99.controller;

import com.hansonwang99.K8sresctrlApplication;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/testlogging")
public class LoggingTestController {
    private static Logger logger = LoggerFactory.getLogger(K8sresctrlApplication.class);
    @GetMapping("/hello")
    public String hello() {
        logger.info("test logging...");
        return "hello";
    }
}
  • Résultats d'exécution

Pratique du cadre de journalisation Spring Boot - partage technique de hansonwang99

Étant donné que le niveau de journalisation est défini sur INFO, les informations de journal contenant INFO et les niveaux supérieurs seront imprimées

On peut voir ici que de nombreux et la plupart des journaux INFO proviennent du framework SpringBt lui-même. Si nous voulons les bloquer, nous pouvons d'abord définir tous les niveaux de journalisation sur ERREUR, afin que les informations INFO du framework lui-même ne soient pas imprimées. Ensuite, définissez des packages spécifiques dans l'application sur les journaux de niveau DEBUG, afin que vous puissiez voir uniquement les journaux de niveau DEBUG et supérieur dans les packages qui vous intéressent.

  • Contrôler le niveau de journalisation d'un package spécifique

Modifier la configuration dans application.yml

logging:
  level:
    root: error
    com.hansonwang99.controller: debug

Évidemment, change root Définissez le niveau de journalisation sur ERROR, puis définissez le niveau de journalisation du package com.hansonwang99.controller sur DEBUG. Cela signifie : désactivez d'abord tout, puis autorisez les méthodes de configuration individuelles

  • Code du contrôleur.

package com.hansonwang99.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/testlogging")
public class LoggingTestController {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    @GetMapping("/hello")
    public String hello() {
        logger.info("test logging...");
        return "hello";
    }
}
  • Résultat en cours

Pratique du cadre de journalisation Spring Boot - partage technique de hansonwang99

Cadre visible Tous les propres journaux de niveau INFO sont masqués et les journaux du package spécifié sont imprimés en douceur par niveau

  • Sortir les journaux dans un certain fichier

logging:
  level:
    root: error
    com.hansonwang99.controller: debug
  file: ${user.home}/logs/hello.log
  • Exécuter les résultats

Pratique du cadre de journalisation Spring Boot - partage technique de hansonwang99

Pratique du cadre de journalisation Spring Boot - partage technique de hansonwang99

En utilisant Spring Boot Logging, nous avons constaté que même si le journal a été généré dans un fichier, une copie est toujours imprimée dans la console. Nous avons constaté que l'utilisation de org.slf4j.Logger ne peut pas résoudre ce problème

Pratique du cadre de journalisation Spring Boot - partage technique de hansonwang99


Intégrer le framework de journalisation Log4J

  • Ajouter une dépendance dans 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>
  • Ajouter le fichier

    dans le répertoire des ressources avec le contenu suivant : log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appenders>
        <File name="file" fileName="${sys:user.home}/logs/hello2.log">
            <PatternLayout pattern="%d{HH:mm:ss,SSS} %p %c (%L) - %m%n"/>
        </File>
    </appenders>

    <loggers>

        <root level="ERROR">
            <appender-ref ref="file"/>
        </root>
        <logger name="com.hansonwang99.controller" level="DEBUG" />
    </loggers>

</configuration>
  • Autres codes restent inchangés

Exécutez le programme et constatez qu'il n'y a pas de sortie de journal sur la console, mais qu'il y a du contenu dans le fichier hello2.log, qui est conforme à nos attentes :

Pratique du cadre de journalisation Spring Boot - partage technique de hansonwang99

Pratique du cadre de journalisation Spring Boot - partage technique de hansonwang99

Pratique du cadre de journalisation Spring Boot - partage technique de hansonwang99

Et le format du journal correspond à celui défini dans le

formatpattern="%d{HH:mm:ss,SSS} %p %c (%L) - %m%n"


Log4J pratique ultérieure

  • configuration 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>
  • configuration log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn">
    <properties>

        <Property name="app_name">springboot-web</Property>
        <Property name="log_path">logs/${app_name}</Property>

    </properties>
    <appenders>
        <console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%d][%t][%p][%l] %m%n" />
        </console>

        <RollingFile name="RollingFileInfo" fileName="${log_path}/info.log"
                     filePattern="${log_path}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="INFO" />
                <ThresholdFilter level="WARN" onMatch="DENY"
                                 onMismatch="NEUTRAL" />
            </Filters>
            <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
            <Policies>
                <!-- 归档每天的文件 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <!-- 限制单个文件大小 -->
                <SizeBasedTriggeringPolicy size="2 MB" />
            </Policies>
            <!-- 限制每天文件个数 -->
            <DefaultRolloverStrategy compressionLevel="0" max="10"/>
        </RollingFile>

        <RollingFile name="RollingFileWarn" fileName="${log_path}/warn.log"
                     filePattern="${log_path}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="WARN" />
                <ThresholdFilter level="ERROR" onMatch="DENY"
                                 onMismatch="NEUTRAL" />
            </Filters>
            <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
            <Policies>
                <!-- 归档每天的文件 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <!-- 限制单个文件大小 -->
                <SizeBasedTriggeringPolicy size="2 MB" />
            </Policies>
            <!-- 限制每天文件个数 -->
            <DefaultRolloverStrategy compressionLevel="0" max="10"/>
        </RollingFile>

        <RollingFile name="RollingFileError" fileName="${log_path}/error.log"
                     filePattern="${log_path}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
            <ThresholdFilter level="ERROR" />
            <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
            <Policies>
                <!-- 归档每天的文件 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <!-- 限制单个文件大小 -->
                <SizeBasedTriggeringPolicy size="2 MB" />
            </Policies>
            <!-- 限制每天文件个数 -->
            <DefaultRolloverStrategy compressionLevel="0" max="10"/>
        </RollingFile>

    </appenders>

    <loggers>


        <root level="info">
            <appender-ref ref="Console" />
            <appender-ref ref="RollingFileInfo" />
            <appender-ref ref="RollingFileWarn" />
            <appender-ref ref="RollingFileError" />
        </root>

    </loggers>

</configuration>
  • Code contrôleur :

package com.hansonwang99.controller;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/testlogging")
public class LoggingTestController {
    private final Logger logger = LogManager.getLogger(this.getClass());
    @GetMapping("/hello")
    public String hello() {
        for(int i=0;i<10_0000;i++){
            logger.info("info execute index method");
            logger.warn("warn execute index method");
            logger.error("error execute index method");
        }
        return "My First SpringBoot Application";
    }
}
  • Résultat d'exécution

Pratique du cadre de journalisation Spring Boot - partage technique de hansonwang99

Pratique du cadre de journalisation Spring Boot - partage technique de hansonwang99

Pratique du cadre de journalisation Spring Boot - partage technique de hansonwang99

Les journaux seront stockés dans différents fichiers selon différents niveaux. Lorsque la taille du fichier journal dépasse 2 Mo, il sera divisé en plusieurs fichiers pour le stockage compressé. fichiers dans l'environnement de production Il est recommandé d'ajuster la taille entre 20 et 50 Mo.


Postscript

Pour des articles plus originaux de l'auteur, voir la rubrique SF

Des articles plus pratiques sur SpringBt par l'auteur sont ici :

  • La pratique du moteur de recherche ElasticSearch dans SpringBoot

  • Une étude préliminaire sur la programmation conjointe Kotlin+SpringBoot



Recommandations associées :

Les 8 frameworks de journalisation Java les plus couramment utilisés par les programmeurs Java

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Installer PHP Xdebug sur MacArticle suivant:Installer PHP Xdebug sur Mac