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

logbackログの非同期印刷方法の紹介(コード例)

不言
リリース: 2019-02-01 11:42:25
転載
5464 人が閲覧しました

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

最近問題が発生しました。顧客のサーバー プログラムのリクエストへの応答が時折遅すぎることがあり、ログを確認したところ、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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート