Heim  >  Artikel  >  Java  >  So verwenden Sie die log4j2-Protokollierung in Springboot

So verwenden Sie die log4j2-Protokollierung in Springboot

WBOY
WBOYnach vorne
2023-05-22 08:58:111020Durchsuche

Häufig verwendetes Protokollierungsframework

  • java.util.logging: Es handelt sich um das von JDK in Version 1.4 eingeführte native Java-Protokollierungsframework.

  • Log4j: Ein Open-Source-Projekt von Apache, das das Protokollziel steuern kann Informationsübertragung. Konsolen, Dateien, GUI-Komponenten usw. können das Ausgabeformat jedes Protokolls steuern. Diese können über eine Konfigurationsdatei flexibel konfiguriert werden, ohne den Anwendungscode zu ändern. Obwohl die Wartung eingestellt wurde, verwenden die meisten Unternehmen derzeit log4j.

  • LogBack: Es handelt sich um eine verbesserte Version von Log4j.

  • Log4j2: Log4j2 ist nicht nur eine aktualisierte Version von Log4j, es wurde von Anfang bis Ende neu geschrieben Oben wird die Implementierung einiger Protokoll-Frameworks vorgestellt. Hier müssen wir die Protokollfassade verwenden, um die Kopplung zwischen dem System und dem Protokollimplementierungs-Framework zu lösen. SLF4J, Simple Logging Facade for Java, ist keine echte Protokollierungsimplementierung, sondern eine Abstraktionsschicht, die es Ihnen ermöglicht, jede beliebige Protokollierungsimplementierung im Hintergrund zu verwenden.

Wie die verschiedenen zuvor vorgestellten Protokoll-Frameworks verfügt jedes Protokoll-Framework über eine eigene separate API. Um das entsprechende Framework zu verwenden, müssen Sie die entsprechende API verwenden, was den Bedarf des Anwendungscodes an das Protokoll-Framework erheblich erhöht. Nach der Verwendung von slf4j kann die Anwendung für Anwendungen unabhängig davon, wie sich das zugrunde liegende Protokollierungsframework ändert, direkt online gehen, ohne dass eine Codezeile geändert werden muss.

Warum log4j2 wählen?

So verwenden Sie die log4j2-Protokollierung in Springboot

Im Vergleich zu anderen Protokollierungssystemen verliert log4j2 weniger Daten; in einer Multithread-Umgebung ist die Leistung mehr als zehnmal höher als bei Logback und so weiter; von jdk1.5, wodurch das Auftreten von Deadlocks reduziert wird. Der Grund für die überlegene Leistung von log4j2 ist, dass log4j2 LMAX verwendet, eine sperrenfreie Inter-Thread-Kommunikationsbibliothek, um die Warteschlangen vor Logback und Log4j zu ersetzen.

Integrationsschritte

Einführung in das Jar-Paket

springboot verwendet standardmäßig das Logback-Protokollierungsframework, daher muss Logback ausgeschlossen werden, da sonst Fehler bei der Meldung von Jar-Abhängigkeitskonflikten auftreten.

<dependency> 
 <groupid>org.springframework.boot</groupid> 
 <artifactid>spring-boot-starter-web</artifactid> 
 <exclusions><!-- 去掉springboot默认配置 --> 
  <exclusion> 
   <groupid>org.springframework.boot</groupid> 
   <artifactid>spring-boot-starter-logging</artifactid> 
  </exclusion> 
 </exclusions> 
</dependency> 

<dependency> <!-- 引入log4j2依赖 --> 
 <groupid>org.springframework.boot</groupid> 
 <artifactid>spring-boot-starter-log4j2</artifactid> 
</dependency>

Konfigurationsdatei

Wenn Sie den Dateinamen anpassen, müssen Sie ihn in application.yml konfigurieren

logging:
 config: xxxx.xml
 level:
 cn.jay.repository: trace
Der Standardname ist log4j2-spring.xml, wodurch die Konfigurationsdateivorlage in application.yml gespeichert wird

log4j verwendet eine .properties-Datei als Hauptkonfigurationsdatei, aber jetzt hat log4j2 diese Methode aufgegeben und verwendet dafür .xml, .json oder .jsn. Vielleicht ist dies auch der Fall. Es ist eine technologische Unvermeidlichkeit Entwicklung, da die Lesbarkeit der Eigenschaftendateien wirklich schlecht ist.

<?xml  version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration>
 <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->

 <!--变量配置-->
 <properties>
 <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
 <!-- %logger{36} 表示 Logger 名字最长36个字符 -->
 <property></property>
 <!-- 定义日志存储的路径,不要配置相对路径 -->
 <property></property>
 <property></property>
 </properties>

 <appenders>

 <console>
  <!--输出日志的格式-->
  <patternlayout></patternlayout>
  <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
  <thresholdfilter></thresholdfilter>
 </console>

 <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
 <file>
  <patternlayout></patternlayout>
 </file>

 <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
 <rollingfile>
  <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
  <thresholdfilter></thresholdfilter>
  <patternlayout></patternlayout>
  <policies>
  <!--interval属性用来指定多久滚动一次,默认是1 hour-->
  <timebasedtriggeringpolicy></timebasedtriggeringpolicy>
  <sizebasedtriggeringpolicy></sizebasedtriggeringpolicy>
  </policies>
  <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
  <defaultrolloverstrategy></defaultrolloverstrategy>
 </rollingfile>

 <!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
 <rollingfile>
  <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
  <thresholdfilter></thresholdfilter>
  <patternlayout></patternlayout>
  <policies>
  <!--interval属性用来指定多久滚动一次,默认是1 hour-->
  <timebasedtriggeringpolicy></timebasedtriggeringpolicy>
  <sizebasedtriggeringpolicy></sizebasedtriggeringpolicy>
  </policies>
  <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
  <defaultrolloverstrategy></defaultrolloverstrategy>
 </rollingfile>

 <!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
 <rollingfile>
  <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
  <thresholdfilter></thresholdfilter>
  <patternlayout></patternlayout>
  <policies>
  <!--interval属性用来指定多久滚动一次,默认是1 hour-->
  <timebasedtriggeringpolicy></timebasedtriggeringpolicy>
  <sizebasedtriggeringpolicy></sizebasedtriggeringpolicy>
  </policies>
  <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
  <defaultrolloverstrategy></defaultrolloverstrategy>
 </rollingfile>

 </appenders>

 <!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
 <!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
 <loggers>

 <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
 <logger>
  <appenderref></appenderref>
 </logger>
 <!--监控系统信息-->
 <!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。-->
 <logger>
  <appenderref></appenderref>
 </logger>

 <root>
  <appender-ref></appender-ref>
  <appender-ref></appender-ref>
  <appender-ref></appender-ref>
  <appender-ref></appender-ref>
  <appender-ref></appender-ref>
 </root>
 </loggers>

</configuration>

Einführung in Konfigurationsparameter

Hier finden Sie eine kurze Einführung in häufig verwendete Konfigurationsparameter

Protokollebene

Mechanismus: Wenn die Ebene einer Protokollnachricht größer oder gleich der Ebene der Konfigurationsdatei ist , es wird aufgezeichnet.

Trace: Tracking, das heißt, das Programm voranzutreiben, Sie können eine Trace-Ausgabe schreiben

Debug: Debuggen, im Allgemeinen als unterste Ebene, Trace wird grundsätzlich nicht verwendet.
  • Info: Wichtige Informationen ausgeben, häufig verwendet
  • Warnung: Achtung, einige Informationen sind keine Fehlerinformationen, aber sie sollten Programmierern auch einige Tipps geben.
  • Fehler: Fehlermeldung. Viel benutzt.
  • fatal: Schwerwiegender Fehler.
  • Ausgabequelle
  • KONSOLE (Ausgabe an Konsole)
  • DATEI (Ausgabe an Datei)

Format
  • SimpleLayout: wird in einfacher Form angezeigt
  • HTMLLayout: mit HTML Tabellenanzeige

PatternLayout: Benutzerdefinierte Formularanzeige
  • PatternLayout Benutzerdefiniertes Protokolllayout:
%d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间,输出到毫秒的时间
%-5level : 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%c : logger的名称(%logger)
%t : 输出当前线程名称
%p : 日志输出格式
%m : 日志内容,即 logger.info("message")
%n : 换行符
%C : Java类名(%F)
%L : 行号
%M : 方法名
%l : 输出语句所在的行数, 包括类名、方法名、文件名、行数
hostName : 本地机器名
hostAddress : 本地ip地址
  • Log4j2-Konfigurationsdetails

  • Root-Knoten-Konfiguration

    hat zwei Attribute:
  • Status

    Überwachungsintervall

    hat zwei Unterknoten:
    • Appenders
    • Loggers (zeigt an, dass mehrere Appenders und Loggers definiert werden können).

    status wird verwendet, um die Ebene des Druckprotokolls von log4j selbst anzugeben.
    • monitorinterval wird verwendet, um das Überwachungsintervall für die automatische Neukonfiguration von log4j anzugeben. Die Einheit ist s, das Minimum beträgt 5 Sekunden um die Ausgabe an den taiwanesischen Appender zu definieren.

    • Name: Geben Sie den Namen des Appenders an. Normalerweise ist nur der Standard auf SYSTEM_OUT eingestellt, nicht auf SYSTEM_ERR.

    PatternLayout: Ausgabeformat. Wenn nicht festgelegt, lautet der Standard : %m%n.

    Der Dateiknoten wird verwendet, um den Appender zu definieren, der die Datei an den angegebenen Speicherort ausgibt.

    Name: Geben Sie den Namen des Appenders an.

  • fileName:指定输出日志的目的文件带全路径的文件名.

  • PatternLayout:输出格式,不设置默认为:%m%n.

  •  RollingFile节点用来定义超过指定条件自动删除旧的创建新的Appender.

    • name:指定Appender的名字.

    • fileName:指定输出日志的目的文件带全路径的文件名.

    • PatternLayout:输出格式,不设置默认为:%m%n.

    • filePattern : 指定当发生Rolling时,文件的转移和重命名规则.

    • Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.

    • TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am.

    • SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.

    • DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。

    Loggers节点,常见的有两种:Root和Logger.

    • Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出

    • level:日志输出级别,共有8个级别,按照从低到高为:All

    • Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。

    • level:日志输出级别,共有8个级别,按照从低到高为:All

    • name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.

    • AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。

    简单使用

    public class LogExampleOther {
     private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleOther.class);
     
     public static void main(String... args) {
     log.error("Something else is wrong here");
     }
    }

    使用lombok工具简化创建Logger类

    lombok就是一个注解工具jar包,能帮助我们省略一繁杂的代码。具体介绍可以看我的这篇教程。

    使用lombok后下面的代码等效于上述的代码,这样会更方便的使用日志。

    @Slf4j
    public class LogExampleOther {
     
     public static void main(String... args) {
     log.error("Something else is wrong here");
     }
    }

    Das obige ist der detaillierte Inhalt vonSo verwenden Sie die log4j2-Protokollierung in Springboot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen