Heim  >  Artikel  >  Backend-Entwicklung  >  Praxis des Spring Boot-Protokollierungsframeworks – technischer Austausch von hansonwang99

Praxis des Spring Boot-Protokollierungsframeworks – technischer Austausch von hansonwang99

不言
不言Original
2018-05-05 15:11:491845Durchsuche

Dieser Artikel teilt Ihnen hauptsächlich die Praxis des Spring Boot-Protokollierungsframeworks mit. Der Codeteil ist auch sehr detailliert.


Übersicht

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!


Verwenden Sie das Spring Boot Logging-Plug-in

  • 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

Praxis des Spring Boot-Protokollierungsframeworks – technischer Austausch von hansonwang99

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

Praxis des Spring Boot-Protokollierungsframeworks – technischer Austausch von hansonwang99

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

Praxis des Spring Boot-Protokollierungsframeworks – technischer Austausch von hansonwang99

Praxis des Spring Boot-Protokollierungsframeworks – technischer Austausch von hansonwang99

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

Praxis des Spring Boot-Protokollierungsframeworks – technischer Austausch von hansonwang99


Log4J-Protokollierungsframework integrieren

  • 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:

Praxis des Spring Boot-Protokollierungsframeworks – technischer Austausch von hansonwang99

Praxis des Spring Boot-Protokollierungsframeworks – technischer Austausch von hansonwang99

Praxis des Spring Boot-Protokollierungsframeworks – technischer Austausch von hansonwang99

Und Das Protokollformat entspricht dem im pattern="%d{HH:mm:ss,SSS} %p %c (%L) - %m%n"-Format definierten Format >


log4j2 xml-Konfiguration
        <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>
Controller-Code:
<?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>
Laufergebnis
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";
    }
}

Praxis des Spring Boot-Protokollierungsframeworks – technischer Austausch von hansonwang99

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.


Postscript

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn