3

log4netでの不可逆ロギングは、パフォーマンスの低下を最小限に抑えながら、エラーにつながるイベントの詳細を取得するのに最適です。ただし、エラーの後にいくつかのメッセージをログに記録して、システムが計画どおりに処理したことを確認することも興味深い場合がよくあります。どのようにそれを行うことができますか?

4

2 に答える 2

5

私はBufferingForwardAppenderのカスタムバージョンを作成します。これは、エラー後に構成可能な数のメッセージをログに記録します。基本的に、しばらくの間エラーが発生した後は「不可逆」をオフにして、すべてのメッセージを直接転送します。

注:エラーの後に他のメッセージがあるかどうかを確認できないため、エラーがログに記録されたらすぐにアペンダーがメッセージをフラッシュすることを確認してください。

于 2011-06-08T08:24:25.960 に答える
4

受け入れられた答えは魅力のように機能しました。簡単にするために、エラー後のメッセージ数を個別に設定しませんでした。代わりに、トリガーメッセージの後に1つのフルバッファー+1が非可逆で送信されます。コード:

public class BufferingForwardingAppenderEx : BufferingForwardingAppender
{
    /// <summary>
    /// If in lossy-mode, set the appender to non-lossy after a send has been done to get what happended after.
    /// </summary>
    public bool NonLossyAfterTriggered { get; set; }

    // Flag that tells if the appender is currently in non-lossy-override-mode
    private bool _nonLossyOverride = false;

    protected override void SendBuffer(global::log4net.Core.LoggingEvent[] events)
    {
        if (NonLossyAfterTriggered)
        {
            SetLossyAccordingToReasonForSending(events);
        }

        base.SendBuffer(events);
    }

    private void SetLossyAccordingToReasonForSending(LoggingEvent[] events)
    {
        if (_nonLossyOverride)
        {
            var newestEvent = events[events.Length - 1];
            var bufferIsSentBecauseItIsFull = !Evaluator.IsTriggeringEvent(newestEvent);

            if (bufferIsSentBecauseItIsFull)
            {
                _nonLossyOverride = false;
                Lossy = true;
            }
        }
        else
        {
            _nonLossyOverride = true;
            Lossy = false;
        }
    }
}

そして、これがどのように構成されているかの例です:

<appender name="BufferingForwardingAppender"
          type="Foo.log4net.BufferingForwardingAppenderEx">
  <bufferSize value="3"/>
  <lossy value="true"/>
  <nonLossyAfterTriggered value="true" />
  <evaluator type="log4net.Core.LevelEvaluator">
    <threshold value="WARN"/>
  </evaluator>
  <appender-ref ref="ConsoleAppender"/>
</appender>

<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern
      value="%date{yyyy-MM-dd HH:mm:ss} %-5level %-13logger{1} %message%newline"/>
  </layout>
</appender>

<root>
  <level value="DEBUG"/>
  <appender-ref ref="BufferingForwardingAppender"/>
</root>

この構成では、単独の警告(またはそれ以上)の前に2つのメッセージが続き、その後に4つのメッセージが続きます。

于 2011-06-08T12:59:23.513 に答える