0

我已经为 log4net 实现了一个自定义附加程序,我正在其中记录到文件并发送邮件。我想为每种情况记录不同的消息字符串。下面的代码在文件中创建了两个日志条目,一个带有附加字符串,一个没有附加字符串。它还发送没有附加字符串的电子邮件。

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);

我的配置文件,一个附加程序是使用配置文件添加的,另一个附加程序是一个 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>

第二个附加程序(在运行时添加):

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

我并不完全清楚您在做什么,因为您的示例实际上并未调用您的扩展方法,但我认为最简单的解决方案是向扩展方法添加另一个参数,该参数指定您是否要发送日志通过电子邮件输入:

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);

因为sendEmail默认值为 true,如果您确实要发送电子邮件,则根本不需要传递参数,这意味着对现有代码没有影响。

于 2014-11-11T11:10:59.193 回答
0

我建议使用两个BufferingFowardAppender基于记录器名称(log4net.Filter.LoggerMatchFilter)的过滤器:

  • 一个转发附加器将根据记录器名称过滤邮件记录器的消息:INFO 级别的根 -> 带有过滤器的转发附加器 MyMailAppender 记录器名称 -> 邮件附加器
  • 一个转发附加程序将过滤标准记录器的消息:INFO 级别的根 -> 带有过滤器的转发附加程序不允许 MyMailAppender 记录器名称通过 -> 其他附加程序

您不需要在代码配置中使用,这完全可以通过配置来实现

于 2014-11-13T08:32:44.457 回答
0

解决方案是使用两个 logger 元素而不是 root,因为 root 适用于所有 appender。因此,添加到根目录的任何内容都将被写入创建重复条目。

    <log4net>
         <logger name="MyMailAppender">
          <level value="INFO" />
        </logger>
        <logger name="LogFileAppender">
          <level value="INFO" />
          <appender-ref ref="LogFileAppender" />
        </logger>
</log4net>

然后在运行时我从 dll 创建附加程序并将其添加到 MyMailAppender 记录器。

于 2014-11-13T21:08:32.860 回答