【问题标题】:log4net different messages for different appenders, creating duplicate log entries in filelog4net 不同附加程序的不同消息,在文件中创建重复的日志条目
【发布时间】:2015-01-07 10:36:24
【问题描述】:

我已经为 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);

我的配置文件,一个appender是使用config文件添加的,另一个appender是一个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;

【问题讨论】:

  • 你能展示一下你的配置文件对于 Appender 的样子吗?也看看下面的stackoverflow.com/questions/21186378/…
  • @DJKRAZE 我添加了配置文件,您链接的问题无法解决我的问题,因为两个附加程序的阈值必须相同。

标签: c# logging log4net log4net-configuration log4net-appender


【解决方案1】:

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

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,所以如果您确实要发送电子邮件,则根本不需要传递参数,这意味着对现有代码没有影响。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      解决方案是使用两个 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 记录器。

      【讨论】:

        猜你喜欢
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-20
        • 2012-09-19
        • 2012-05-28
        相关资源
        最近更新 更多