私はログバック実装をAsyncAppender
使用しており、スレッド内でロギングを使用するように作成しました。
スレッドはモニターのようなものになります。BlockingQueue
他のスレッドから追加されたオブジェクトを消費し、キューが空ではなく、ブロッキング信号がない間、キューの内容をログに記録します。同時に、キューはいくつかのスレッドでいっぱいになります。
スレッドは、コーディネーターから停止信号を受け取ると中断するため、キューにコンテンツを追加しません。
ブロッキング シグナルが発生すると (プロデューサ スレッドはすでに中断されています)、モニター キューは中断され、キューBlockingQueue
は空になります。
監視スレッドのロギングには、次の 2 つの問題があります。
プロデューサが中断した後、キューは空になるため、監視スレッドもすぐに中断し、キューからすべてを削除した場合でも、キューの内容をすべて表示することはありません。
表示されるメッセージの順序 (コンソール アペンダーとファイル アペンダーの両方) は、キューに挿入されたものと同じではありません。
スレッド内に静的ロガーを作成する、非静的ロガーを作成する、モニター スレッドが作成されるクラスからローダーを提供する、という 3 つの異なるアプローチを試しました。
モニター スレッドの while(true){} ループですべてを実行すると、すべてが表示されますが、正しい順序ではなく、スレッドを中断する方法を見つけなければならないという事実もあります。
のケースも確認しましたMDC
が、私の問題はどういうわけか異なります。プロデューサーの製品を消費し、生産中にそれを行う必要があります。
スレッドの内部も確認しましたLoggerContext
が、開始されたのはfalseです。本当ではないでしょうか。
スレッドを中断する前にすべてのコンテンツを表示し、正しい順序で表示する方法についてのアイデアは価値があります。
ありがとう。