[springboot]Slf4jロギングフレームワークのアーキテクチャ

Javaログログに接触したばかりの学生は、さまざまなログフレームワーク間のjarが常に競合しているなど、さまざまなログフレームワークに恐れを感じる可能性があり、他の多くの小さなパートナーは頭痛の種です。次に、この記事の内容は、さまざまなJavaログフレームワークの開発プロセス、それらの間の関係、およびそれらの選択方法を紹介することです。

1.さまざまなロギングツールキット

1.1。ロギングフレームワーク

  • JDK java.util.loggingパッケージ:java.util.loggingは、jdk1.4によってリリースされたjavaログパッケージであり、長期的なアプリケーションを備えたログツールキットと言えます。
  • log4j:apacheのオープンソースプロジェクト。強力なJavaログサポートを提供し、分散環境ログの多言語共存を実現するために、C、C ++、. Net、PL/SQLなどの他の言語へのインターフェイスも提供します印刷。更新は中止されたため、お勧めしません。
  • Logback:log4jの創設者によって設計されたもう1つのオープンソースログコンポーネントであり、SpringBootのデフォルトのログフレームワークとして広く使用されています。
  • log4j2:Apache Log4j2はLog4jへのアップグレードであり、その前身であるLog4j1.xに比べて大幅な改善を提供し、Logbackアーキテクチャのいくつかの問題を修正しながらLogbackで利用可能な多くの改善を提供します。これは、LMAX Companyに基づくDisruptor(オープンソースのロックフリー同時実行フレームワーク)の開発に基づいています。これは、アーキテクチャ設計の観点からLog4jとLogbackの欠陥を改善し、超高スループットと低遅延を実現し、パフォーマンスを向上させます。 Log4j1.xおよびLogbackよりも。

1.2.ログファサード

  • commons-logging:Apache commonsクラスライブラリのメンバーであり、ログファサードとして、log4jまたはJDKロギングのどちらを使用するかを自動的に選択できますが、Log4jおよびJDKロギングのAPIには依存しません。プロジェクトのクラスパスにlog4jクラスライブラリが含まれている場合は、log4jが使用されます。含まれていない場合は、JDKロギングが使用されます。
  • SLF4J:最も広く使用されているログファサードと言えます。これは、バックグラウンドで任意のログライブラリを使用できるログ抽象化レイヤーを提供します。例:log4j、log4j2、logback

1.3丸太のファサードの存在の重要性

ここに画像の説明を挿入

ロギングフレームワークを使用するだけでなく、ロギングファサードを考え出すのはなぜですか?
ログファサード(SLF4J)は、主にJavaログアクセス用の標準化されたAPIフレームワークを提供することです。その主な重要性は、インターフェイスを提供することです。特定の実装は、log4jやlogbackなどの他のログフレームワークによって実装できます。一般的なJavaプロジェクトの場合、ロギングフレームワークはファサードとしてslf4j-apiを選択し、特定の実装フレームワーク(log4j、log4j2、logbackなど)と組み合わせて、中央のブリッジを使用してブリッジングを完了します。

上記で紹介したいくつかのロギングフレームワークでは、各ロギングフレームワークに独自のAPIがあります。対応するフレームワークを使用するには、対応するAPIを使用する必要があります。これにより、ロギングフレームワークのアプリケーションコードの結合要件が大幅に増加します。SLF4Jファサードを使用すると、プログラマーは常にSLF4J用にプログラムします。これにより、ビジネスコードに対応する変更を加えることなく、基盤となるロギングフレームワークを簡単かつ迅速に置き換えることができます。

SLF4Jでログを記録する場合、通常、ログに記録する必要のある各クラスに次のようにLogger変数を定義する必要があります。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@RestController
public class LogTestController {
    
    
    private static final Logger logger = LoggerFactory.getLogger(LogTestController.class);

    @GetMapping("/test")
    public void test(){
    
    
        logger.trace("Trace 日志...");
        logger.debug("Debug 日志...");
        logger.info("Info 日志...");
        logger.warn("Warn 日志...");
        logger.error("Error 日志...");
    }
}

これは明らかに反復作業であり、開発効率が低下します。プロジェクトにLombokを導入すると、提供される@ Slf4jアノテーションを使用して、上記の変数を自動的に生成できます。慣用的なLOGGERを使用する場合、デフォルトの変数名はlogです。変数名として使用すると、プロジェクトのルートディレクトリにlombok.configファイルを追加lombok.log.fieldName=LOGGERし、ファイルに構成アイテムを追加できます。

2.ログフレームの選択

  • SpringBootのデフォルトのロギングフレームワークはLogbackを使用します
  • その中でも、Log4jは、更新が停止されており、使用が推奨されていない古い関数ライブラリと見なすことができます。対照的に、そのパフォーマンスと関数も最悪です。
  • ログバックはSpringBootのデフォルトですが、パフォーマンスはLog4j2よりも劣っています。したがって、この段階では、Log4j2がログの最初の選択肢です(log4jシリーズではセキュリティ障害が発生しています。バグが修正されたら、新しいバージョンを使用してください。 )。

SLF4J + Log4j2は、推奨されるロギングオプションです。

パフォーマンステストの結果
ここに画像の説明を挿入

参考:log4j2公式サイト

3.ログレベル

各ログフレームワークの統合構成について詳しく説明する前に、まず、最も一般的なログレベル(ERROR、WARN、INFO、DEBUG、およびTRACE)について一般的に理解しましょう。ALL、OFF、FATALなどの他の製品と同様に、基本的に開発プロセスに関与するべきではありません。したがって、以下の常用対数レベルが低から高に導入されます。

  1. トレース:追跡。一般に、コアシステムのパフォーマンスをデバッグしたり、問題を追跡したりするのに役立ちます。このレベルは非常に低く、通常は有効になっていません。有効にすると、ログはすぐにディスクをいっぱいにします。
  2. デバッグ:デバッグ。誰もがこれに精通している必要があります。開発プロセスは、主にいくつかの実行情報などを印刷および記録することです。
  3. 情報:情報。これは最も一般的であり、それらのほとんどはデフォルトでこのレベルのログになります。通常、一部のインタラクション情報、一部のリクエストパラメータなどが記録されます。問題を特定したり、オンサイト環境を復元するときに使用すると便利です。このログは比較的重要です。
  4. 警告:警告。これは通常、エラーが発生しやすい可能性のある情報を記録します。たとえば、起動時に、特定の構成ファイルが存在しないか、特定のパラメーターが設定されていません。
  5. エラー:エラー。これも比較的一般的で、一般的には例外が発生したときに出力されます。エラーは発生しますが、システムの正常な動作には影響しません。ただし、システムエラーやダウンタイムにつながる可能性があります。

小さいものから大きいものへのログレベルはtrace<debug<info <warn <error <fatalです。ログフレームワークのデフォルトのログレベルは通常INFOに設定されているため、サンプルトレースのトレースログとデバッグログ、およびセクション1.3のデバッグレベル。 。見えません。

2020-08-17 13:59:16.566  INFO c.z.b.l.controller.LogTestController     : Info 日志...
2020-08-17 13:59:16.566  WARN  c.z.b.l.controller.LogTestController     : Warn 日志...
rn 日志...
2020-08-17 13:59:16.566 ERROR  c.z.b.l.controller.LogTestController     : Error 日志...

4つの一般的な用語の概念分析

  1. アペンダー:主に、ファイル、データベース、コンソール印刷など、ログの出力場所を制御します。
  2. ロガー:パッケージまたは特定のクラスのログ印刷レベルを設定し、アペンダーを指定するために使用されます
  3. ルート:ロガー、特別な親ロガーでもあります。子ロガーでadditivity="false"が構成されていない限り、すべての子ロガーは最終的に出力をルートにストリーミングします。
  4. RollingPolicy:すべてのログを1つのファイルに保存するのは適切ではないため、特定の期間またはファイルサイズに従ってログファイルを保存するローリングポリシーを指定できます。
  5. RolloverStrategy:ログクリーンアップ戦略。通常、ログが保持される期間を指します。
  6. 非同期ログ:別のスレッドを開いてログを書き込み、メインスレッドをブロックしないという目的を達成します。

ここに画像の説明を挿入

  • ログを同期するために、ログがディスクに書き込まれるまでメインスレッドは実行を継続できません。
  • 非同期ログの場合、メインスレッドはログを書き込み、ログメッセージをキューに入れてから、下方向に実行し続けます。このプロセスはメモリレベルで完了します。その後、専用スレッドがキューからログデータを取得してディスクに書き込むため、メインスレッドがブロックされることはありません。メインスレッド(コアビジネスコード)は効率的に実行されます。

おすすめ

転載: blog.csdn.net/hanxiaotongtong/article/details/122893005