検索
ホームページJava&#&チュートリアルlogbackログの非同期印刷方法の紹介(コード例)

この記事では、ログバック ログの非同期出力方法 (コード例) を紹介します。必要な方は参考にしていただければ幸いです。

最近問題が発生しました。顧客のサーバー プログラムのリクエストへの応答が時折遅すぎることがあり、ログを確認したところ、RSA 署名検証コードが 20 秒を超えて実行されていたことが判明しました。一方、通常の状況では、必要な時間は 16 ミリ秒 だけです。

RSA 証明書はサーバーの起動時に読み込まれるため、ファイルの読み取りが遅いという問題はありません。これらのコード行を確認した後、最も疑わしいのは、logback ログ出力のコードです。

運用ログの構成を確認しました。logback.xml の構成では、今月のログ ファイルがすべて同じフォルダーに含まれています。 2019 年 1 月の文書。各ファイルは

*.log.zip というサフィックスと 10MB のサイズで構成されます。これは、10MB がサイズ区切りのファイルであることを意味します。ログ印刷クラスは RollingFileAppender で構成されます。

2019 年 1 月 30 日、2019 年 1 月のフォルダーの下に 5,000 を超えるログ ファイルが生成され、1 日あたり平均 167 のログ ファイルが生成されました。

つまり、ログ ファイルが多すぎてインデックス ファイルの時間が長すぎるため、コードの実行が遅くなっていると考えられます。つまり、これを疑いたい場合は、前提条件があります。 : ログの印刷は同期であり、印刷ログが呼び出されます。 コード行が実行されてファイルに書き込まれた後、ビジネス コードは引き続き実行されます。

何人かの同僚に尋ねたところ、ログの印刷は非同期で実行されると全員が言いました。同期だと答えたのは 1 人の友人だけでした。ログの印刷とファイルの書き込みには時間がかかり、ログ フレームワークはファイルを同期的に書き込むべきではないと誰もが考えています。ただし、実際には、非同期印刷が構成されていない場合、ログは同期的に印刷されます。

ブレークポイントのフォローアップ コードにより、ログがファイルに同期的に書き込まれることがわかりました。構成されたアペンダーが AsyncAppender である場合にのみ、ログの出力は非同期で出力されます。

ログを同期的に出力する場合の状況は次のとおりです:

logback.xml 構成:

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    ......
</appender>

<root level="DEBUG">
    <appender-ref ref="CONSOLE"/>
</root>

実行コード:

LogWork.debug("111111111111");
System.out.println("2222222222222");

実行結果:

ご覧のとおり、実行結果は次のとおりです。ログ フレームワークが最初に出力されて実行され、その後、後続のビジネス コードが実行されます。だから同期なんです。

非同期印刷ログ クラスを構成する方法は次のとおりです:

非同期印刷ログ クラス AsyncAppender は他のログ印刷クラスを参照する必要があり、ASYNC は印刷する必要があるだけです。印刷する必要があるログ 定義されたキャッシュ キューに書き込み、デーモン スレッドを開始してキューからログを取得し、CONSOLE ログ プリンタを呼び出してファイルを書き込みます。このようにして、ログの印刷は非同期で実行されます。

logback.xml 設定:

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    ......
</appender>

<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
    <discardingThreshold>0</discardingThreshold>
    <queueSize>100</queueSize>
    <neverBlock>true</neverBlock>
    <appender-ref ref="CONSOLE"/>
</appender>

<root level="INFO">
    <appender-ref ref="ASYNC"/>
</root>

実行コード:

LogWork.debug("111111111111");
System.out.println("2222222222222");

実行結果:

実行結果は、印刷するログ フレームワークを呼び出すコードが実行された後、印刷するログをキャッシュ キューに入れるだけであることを示しています。 、その後、次のコードの実行が継続されるため、次の 222222 が最初に出力され、次に 111111 が出力されます。説明によると、構成後、ログの出力は非同期で動作します。

記事の冒頭の質問でログ出力の同期の問題が提起されていたので、少し調べてみましたが、最終的には、それが発生した問題と結び付くことはありませんでした。ログは同期的に出力されました。コードの実行が時折数分間極端に遅くなる理由を説明する方法はありません。証拠が不十分なので結論は出せない。

以上がlogbackログの非同期印刷方法の紹介(コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター