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.
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 !
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
É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
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
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
<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>
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>
Et le format du journal correspond à celui défini dans le
formatpattern="%d{HH:mm:ss,SSS} %p %c (%L) - %m%n"
<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>
<?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>
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"; } }
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.
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!