Dieser Artikel teilt Ihnen hauptsächlich die Praxis des Spring Boot-Protokollierungsframeworks mit. Der Codeteil ist auch sehr detailliert.
In Java-Anwendungen werden Protokolle im Allgemeinen in die folgenden 5 Ebenen unterteilt:
ERROR-Fehlermeldung
WARN-Warnmeldung
INFO allgemeine Informationen
DEBUG-Debugging-Informationen
TRACE-Tracking-Informationen
Spring Boot verwendet Apache Commons Logging als internes Protokollierungsframework, bei dem es sich lediglich um eine Protokollierungsschnittstelle handelt In tatsächlichen Anwendungen ist es erforderlich, die entsprechende Protokollimplementierung für diese Schnittstelle anzugeben.
Die Standardprotokollierungsimplementierung von SpringBt ist Java Util Logging, das Protokollierungspaket, das mit dem JDK geliefert wird. Darüber hinaus unterstützt SpringBt natürlich auch beliebte Protokollierungsimplementierungen wie Log4J und Logback.
Vereinigen Sie die oben genannten Protokollimplementierungen gemeinsam als Protokollrahmen
Lass es uns üben!
Fügen Sie zunächst die Konfiguration zur application.properties-Datei hinzu:
logging.level.root=INFO
Der Controller-Teilecode lautet wie folgt:
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"; } }
Laufergebnis
Da die Protokollebene auf INFO eingestellt ist, werden Protokollinformationen mit INFO und höheren Ebenen gedruckt.
Hier sind so viele zu sehen und die meisten INFO-Protokolle stammen vom SpringBt-Framework selbst. Wenn wir sie blockieren möchten, können wir zuerst alle Protokollebenen auf FEHLER setzen, sodass die INFO-Informationen des Frameworks selbst nicht gedruckt werden. Legen Sie dann bestimmte Pakete in der Anwendung auf Protokolle der Stufe DEBUG fest, sodass Sie nur Protokolle der Stufe DEBUG und höher in den Paketen sehen können, die Sie interessieren.
Kontrollieren Sie die Protokollebene eines bestimmten Pakets
Ändern Sie die Konfiguration in application.yml
logging: level: root: error com.hansonwang99.controller: debug
Natürlich Root ändern Setzen Sie die Protokollebene auf ERROR und dann die Protokollebene des com.hansonwang99.controller
-Pakets auf DEBUG. Dies bedeutet: Deaktivieren Sie zuerst alle und erlauben Sie dann einzelne Einstellungsmethoden
Controller-Code
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"; } }
Laufergebnis
Sichtbarer Rahmen Alle Protokolle der eigenen INFO-Ebene werden ausgeblendet und die Protokolle im angegebenen Paket werden erfolgreich nach Ebene gedruckt
Protokolle in eine bestimmte Datei ausgeben
logging: level: root: error com.hansonwang99.controller: debug file: ${user.home}/logs/hello.log
Laufergebnisse
Bei Verwendung von Spring Boot Logging haben wir festgestellt, dass das Protokoll zwar in eine Datei ausgegeben wurde, aber immer noch eine Kopie in der Konsole gedruckt wird. Wir haben festgestellt, dass die Verwendung von org.slf4j.Logger
dieses Problem nicht lösen kann
Abhängigkeit in pom.xml hinzufügen
<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>
Fügen Sie die Datei log4j2.xml
im Ressourcenverzeichnis mit folgendem Inhalt hinzu:
<?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>
Andere Codes bleiben unverändert
Führen Sie das Programm aus und stellen Sie fest, dass auf der Konsole keine Protokollausgabe erfolgt, die Datei hello2.log jedoch Inhalte enthält, die unseren Erwartungen entsprechen:
Und Das Protokollformat entspricht dem im pattern="%d{HH:mm:ss,SSS} %p %c (%L) - %m%n"
-Format definierten Format >
<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"; } }
Protokolle werden je nach Ebene in verschiedenen Dateien gespeichert. Wenn die Protokolldateigröße 2 MB überschreitet, wird sie zur komprimierten Speicherung in mehrere Dateien aufgeteilt Dateien in der Produktionsumgebung Es wird empfohlen, die Größe auf 20-50 MB anzupassen.
Weitere Originalartikel des Autors finden Sie in der SF-Kolumne
Weitere praktische Artikel des Autors zu SpringBt finden Sie hier:
Die Praxis der ElasticSearch-Suchmaschine in SpringBoot
Eine vorläufige Studie zur gemeinsamen Programmierung von Kotlin+SpringBoot
Verwandte Empfehlungen:
Die 8 am häufigsten verwendeten Java-Protokollierungsframeworks für Java-Programmierer
Das obige ist der detaillierte Inhalt vonPraxis des Spring Boot-Protokollierungsframeworks – technischer Austausch von hansonwang99. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!