当前位置: 首页 > 知识库问答 >
问题:

log4net 不同追加器的不同消息,在文件中创建重复的日志条目

狄新立
2023-03-14

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

共有3个答案

容宏逸
2023-03-14

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

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

然后在运行时,我从dll创建追加器并将其添加到MyMailAppender记录器中。

欧阳勇
2023-03-14

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

  • 一个转发附加程序将根据记录器名称过滤邮件记录器的消息:INFO级别的root-

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

赵奕
2023-03-14

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

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

由于<code>sendmail</code>的默认值为true,因此如果确实要发送电子邮件,则根本不需要传递参数,这意味着对现有代码没有影响。

 类似资料:
  • 由于log4j的官方文档是一个断开的链接,而且入门指南对我没有帮助,所以我想知道如何使用文件而不是文件为同一个记录器使用两个具有不同日志级别的追加器。 例如,像这样:

  • 如何编写一个简单的log4j2.xml文件,将不同级别的日志放入不同的文件中? 例如,我们有错误日志,任何信息日志,我需要将所有错误日志消息推入一个日志文件,所有信息日志消息推入另一个文件。 我怎么做?

  • 以下是我的java logback配置: 我想在这里做的是:我有两个日志追加器:一个用于控制台,另一个用于日志文件;但是对于相同的java软件包(例如:组织.apache.zookeeper),我想使用两个不同的日志级别,INFO用于文件追加器和错误用于康多尔;但是我的日志配置优势无法正常工作。任何人都可以找出我的错误或一些解决方案吗?

  • 我正在从事一个Spring Hibernate项目,其中包含Spring AMQP RabbitMQ消息传递实现。rabbitmq配置位于一个单独的xml中,该xml被导入到根应用程序上下文中。rabbitmq侦听器接收器每秒轮询一次队列。重要的日志消息被大量的调试级轮询消息隐藏在日志文件中。 有没有办法将轮询日志分离到另一个文件中,或者阻止它污染日志? 我使用log4j进行日志记录;配置如下。

  • 我在我的项目中使用log4j。我想有标准输出、调试记录器和最终报告记录器。调试记录器几乎写调试/信息级别的消息。报告将是不同的记录器,只写信息消息。我尝试了不同的方法,阅读了很多示例,我仍然无法解决这个问题。要么我丢失了我的标准输出,要么我将所有调试写入两个记录器。 我的密码在这里 } 任何提示都将不胜感激

  • 我的目标是: 实现所有自定义,内置记录器从同一个包到不同的文件。 信息-信息日志文件 我尝试的是: 问题是: 记录器名称相同。因此,最新的记录器只能工作。在这种情况下,Info可以工作,但也不能调试。 我的疑问是: 我引用了这么多帖子。我认为下面的方法是有效的。 按此处所述,将每一个作为自定义记录器。但我确信这是否正确的解决方案