この記事では、ログバック ログの非同期出力方法 (コード例) を紹介します。必要な方は参考にしていただければ幸いです。
最近問題が発生しました。顧客のサーバー プログラムのリクエストへの応答が時折遅すぎることがあり、ログを確認したところ、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");
以上がlogbackログの非同期印刷方法の紹介(コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。