4

これを一貫して再現することはできませんでした。これはログバックのバグだと思いますが、明らかにそうは思えず、提出する前にクリーンで再現可能なテストケースが必要になるので、誰かが同様の動作を見た場合に備えて SO に尋ねています。

基本的にSMTPAppender、次のようなものがあります。

<appender name="QA-SMTP"
    class="ch.qos.logback.classic.net.SMTPAppender">
            <!-- SMTP appends a default evaluator of on error, this is the simplest evaluator I found to implement -->
    <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
        <marker>me.unroll.logging.loggers.InfoEmail.QA</marker>
    </evaluator>

    <smtpHost>smtp.gmail.com</smtpHost>
    <smtpPort>465</smtpPort>
    <SSL>true</SSL>
    <username>test</username>
    <password>test</password>
    <from>test</from>
    <to>test</to>
    <subject>%message</subject>
    <layout>
        <pattern>hello! thread: %thread</pattern>
    </layout>
</appender>

と、こんな感じのメールが来ています。これは、1)がスレッドでlogger.error(...)呼び出された場合main、または 2) テスト プールを作成して送信したばかりの場合には発生しませんでしたが、実際の本番環境では頻繁に発生しましたが、一貫してではありませんでした。は MINA からのコールバック中です)。

こんにちは!スレッド: メインこんにちは! スレッド: NioProcessor-2

簡潔にするために省略した別のアペンダーと一致する別のケース:

ユーザー / に対して作成されたアクションが実行されました。

作成者: ip-10-212-90-140.ec2.internal タイムスタンプ: 2013 年 2 月 19 日 02:48:09.747 ロガー ソース: me.unroll.logging.loggers.InfoEmail アプリケーション: 監視クライアント yahoo === ========================= ユーザー 12345 / test@gmail.com に対してアクションが実行されました

マシンで作成: ip-10-212-90-140.ec2.internal タイムスタンプ: 2013 年 2 月 19 日 15:24:06.016

「ユーザーID/メール」はから取得されますMDC-これが、スレッドを明示的に印刷するという考えがあった理由です。基本的に、同じログ イベントが作成されたように見えます。1 つはメイン スレッドからのもので (logback はどうやってメイン スレッドを追加できたのでしょうか? わからない)、もう 1 つは問題の実際のスレッドからのものです。

誰かがこの動作を見たことがありますか、または修正方法を知っていますか?

4

1 に答える 1

1

あなたの質問を誤解したかもしれませんが、あなたが言っているように、logback は 1 つのメールで 2 つのイベントを送信することがあります。これは設計によるもので、イベントのパックが非常に高速に発生した場合にそれらを収集できるようにする bufferSize があります。ドキュメントからの引用があります:

SMTPAppender は、ログ イベントを 1 つ以上の固定サイズのバッファーに蓄積し、ユーザー指定のイベントが発生した後に、適切なバッファーの内容を電子メールで送信します。SMTP メール送信(送信)は非同期で行われます。デフォルトでは、電子メール送信はレベル ERROR のロギング イベントによってトリガーされます。

エバリュエーターをマーカーベースに変更しました。これは、ロガーに追加された以前のイベントが、マーカー付きのイベントが来るまでバッファーに留まることを意味します。

また、評価者が電子メール送信をトリガーする方法にも注意してください。

したがって、SMTPAppender によって送信される電子メールで配信されるロギング イベントの数は、上限が 256 です。

メールごとに 1 つのイベントが必要な場合は、バッファー サイズを 1 に変更する必要があります。

SMTPAppender は、循環バッファーに最後の 256 個のログ イベントのみを保持し、バッファーがいっぱいになると古いイベントを破棄します。

しかし、私が理解asynchronousSendingしているように、 false に変更すると、メッセージが送信されるまでロギングステートメントがブロックされます。

おそらく、パターンの最後に「%n」を追加するだけで、ロギング イベントが新しい行で区切られ、読みやすくなります。

免責事項: 私はドキュメントを読んだだけで、自分で試したことはありません。信じないでください。自宅で試してみてください。

于 2013-03-05T09:50:45.747 に答える