ホームページ  >  記事  >  Java  >  Springboot で log4j2 ロギングを使用する方法

Springboot で log4j2 ロギングを使用する方法

WBOY
WBOY転載
2023-05-22 08:58:111091ブラウズ

一般的に使用されるロギング フレームワーク

  • java.util.logging: JDK バージョン 1.4

    で導入された Java ネイティブ ロギング フレームワークです。
  • Log4j: Apache のオープンソースプロジェクトで、ログ情報のコンソール、ファイル、GUI コンポーネントなどへの送信先を制御したり、各ログの出力形式を制御したりできます。設定ファイルを通じて柔軟に制御でき、アプリケーションコードを変更せずに設定可能。メンテナンスは停止されていますが、現在ではほとんどの企業がlog4jを使用しています。

  • LogBack: Log4j の改良版です

  • Log4j2: Log4j2 は単なる Log4j のアップグレード版ではありません。すべてが書き換えられています

Log facade slf4j

上記ではいくつかのログ フレームワークの実装を紹介していますが、ここでは使用する必要があります。 logs Facade は、システムとログ実装フレームワークの間の結合を解決します。 SLF4J (Simple Logging Facade for Java) は、実際のロギング実装ではなく、バックグラウンドで任意のロギング実装を使用できるようにする抽象化レイヤーです。

Springboot で log4j2 ロギングを使用する方法

先ほど紹介したいくつかのログ フレームワークと同様に、各ログ フレームワークには独自の API があり、対応するフレームワークを使用するには、対応する API を使用する必要があります。アプリケーション コードとロギング フレームワークの結合を強化します。

アプリケーションの slf4j を使用した後は、基礎となるロギング フレームワークがどのように変更されても、コード行を変更することなく、アプリケーションを直接オンラインに移行できます。

log4j2 を選択する理由

他のログ システムと比較して、log4j2 は失われるデータが少なく、マルチスレッド環境ではディスラプター テクノロジが logback よりも高いパフォーマンスを発揮します。 10 回; jdk1.5 の同時実行機能を利用してデッドロックの発生を減らす;

log4j2 のパフォーマンスが優れている理由は、log4j2 が代わりにロックフリーのスレッド間通信ライブラリである LMAX を使用しているためです。 logback と log4j の前のキューの同時実行パフォーマンスが大幅に向上しました。

統合手順

Jar パッケージの紹介

springboot はデフォルトで logback ログ フレームワークを使用するため、logback をそうしないと、jar 依存関係の競合に関するエラー レポートが生成されます。

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

設定ファイル

ファイル名をカスタマイズする場合は、application.ymlで設定する必要があります

logging:
 config: xxxx.xml
 level:
 cn.jay.repository: trace

デフォルト名はlog4j2- spring.xml、これにより、application.yml

構成ファイル テンプレートを構成する必要がなくなり、.properties ファイルをメイン構成ファイルとして使用します。 log4j2 このメソッドは廃止され、.xml、.json、または .jsn メソッドが使用されていますが、プロパティ ファイルの可読性が非常に悪いため、これは技術開発の必然かもしれません。

<?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>

構成パラメータの概要

一般的に使用される構成パラメータについて簡単に説明します

ログ レベル

  • メカニズム: ログ メッセージのレベルが設定ファイルのレベル以上の場合、ログ メッセージが記録されます。

  • trace: トレースはプログラムを進めるためのもので、トレース出力を書くことができます。

  • debug: デバッグ、通常は最下位レベルとして、トレースします。基本的には使用しておりません。

  • info: 重要な情報を出力します。さらに使用します。

  • warn: 警告。一部の情報はエラー情報ではありませんが、ユーザーにも提供する必要があります。プログラマー向けのヒント。

  • #エラー: エラー メッセージ。たくさん使いました。

  • fatal: 致命的なエラー。

出力ソース

  • CONSOLE (コンソールへの出力)

  • FILE (ファイルへの出力)

  • #形式

    SimpleLayout: 単純な形式で表示
  • HTMLLayout: HTML テーブル内に表示
  • PatternLayout: カスタム フォームの表示
  • PatternLayout カスタム ログ レイアウト:
%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 構成の詳細

ルート ノード構成

## には 2 つの属性があります:

##status

  • monitorinterval

  • には 2 つの子ノードがあります:

Appenders

  • Loggers (複数の Appender と Logger を示します)。

  • status は、log4j 自身の印刷ログのレベルを指定するために使用されます。

  • monitorinterval は、log4j の自動再構成の監視間隔を指定するために使用されます。単位は s、最小値は 5 秒です。

アペンダー ノード

コンソール、ローリングファイル、ファイルという 3 つの共通サブノードがあります。

コンソール ノードは、コンソールへのアペンダー出力を定義するために使用されます。

# name: アペンダーの名前を指定します。

  • 通常、デフォルトは SYSTEM_ERR ではなく SYSTEM_OUT にのみ設定されます

  • PatternLayout: 出力形式 (設定されていない場合、デフォルトは %m%n.

  • File ノードは、アペンダーを定義するために使用されます。指定された場所にファイルを出力します。

name: アペンダーの名前を指定します。

  • 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");
     }
    }

    以上がSpringboot で log4j2 ロギングを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。