0

ファイルへのログ記録とメールの送信を行う log4net のカスタム アペンダーを実装しました。ケースごとに異なるメッセージ文字列をログに記録したい。以下のコードは、ファイルに 2 つのログ エントリを作成します。1 つは文字列が追加され、もう 1 つは文字列が追加されていません。また、文字列を追加せずに電子メールを送信します。

public static void Log(this ILog log, Level level, string message)
{
    var token = string.Format("{0},{1},{2}", System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, level, message);
    int count = _tokenTimeThrottler.CheckAllow(token);
    if (count >= 0)
    {
        //only to file logger, with an appended string
        log = LogManager.GetLogger("LogFileAppender");
        log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, level, count <= 1 ? message : count + " counts of: " + message, null);
    }

    //only to mail
    log = LogManager.GetLogger("MyMailAppender");
    log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, level, message, null);
    }

しかし、私がやっているときにファイルにログを記録したくありません。

//only to mail
log = LogManager.GetLogger("MyMailAppender");
log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, level, message, null);

私の構成ファイル、1つのアペンダーは構成ファイルを使用して追加され、もう1つのアペンダーはdllであるため、実行時に追加されます。

最初のアペンダー:

<log4net>
    <root>
      <level value="INFO" />
      <appender-ref ref="LogFileAppender" />
    </root>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="C:\git\logs\log.log" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d [%t] %-5p  %m%n" />
      </layout>
    </appender>
</log4net>

2 番目のアペンダー (実行時に追加):

Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
      PatternLayout patternLayout = new PatternLayout { ConversionPattern = "%d [%t] %-5p %m%n" };

      MyMailAppender myAppender = new MyMailAppender 
      {
        Name = "MyMailAppender",
        Layout = patternLayout,
        Access = "ghjkgj",
        Threshold = Level.Info,
      };

      myAppender .ActivateOptions();
      hierarchy.Root.AddAppender(myAppender );

      hierarchy.Root.Level = Level.All;
      hierarchy.Configured = true;
4

3 に答える 3

0

ロガー名 ( )BufferingFowardAppenderに基づくフィルターで2 つを使用することをお勧めします。log4net.Filter.LoggerMatchFilter

  • 1 つの転送アペンダーは、ロガー名に基づいてメーリング ロガーのメッセージをフィルター処理します: INFO レベルのルート -> MyMailAppender ロガー名のフィルターを使用した転送アペンダー -> メール アペンダー
  • 1 つの転送アペンダーは、標準ロガーのメッセージをフィルタリングします: INFO レベルのルート -> MyMailAppender ロガー名を通過させないフィルター付きの転送アペンダー -> 他のアペンダー

コード構成で使用する必要はありません。これは構成のみで完全に実行可能です

于 2014-11-13T08:32:44.457 に答える
0

あなたの例では実際に拡張メソッドを呼び出していないため、何をしているのか完全にはわかりませんが、最も簡単な解決策は、ログを送信するかどうかを指定する別のパラメーターを拡張メソッドに追加することだと思いますメールでエントリー:

public static void Log(this ILog log, Level level,
                       string message, bool sendEmail = true)
{ …

 if (sendEmail)
  { 
      //only to mail
      log = LogManager.GetLogger("MyMailAppender");
      log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, level, message, null);
  }
}

次に、いつ送信したくないかを指定します。

log = LogManager.GetLogger("MyMailAppender");

// Call extension method, specifying no email should be sent
log.Log(level, message, false);

のデフォルト値は true であるためsendEmail、メールを送信する場合は、パラメーターを渡す必要はまったくありません。つまり、既存のコードに影響はありません。

于 2014-11-11T11:10:59.193 に答える