每种方法不同的appender

时间:2011-06-16 21:22:01

标签: c# .net asp.net logging log4net

刚开始使用log4net并试图了解配置和记录器层次结构。此层次结构是基于名称空间还是类和方法/函数层次结构?

假设我有以下类结构......

public class MyClass
{
  private static readonly ILog log = LogManager.GetLogger(typeof(MyClass));

  public void Method1()
  {
    log4net.info("message");
  }

  public void Method2()
  {
    log4net.info("message");
  }

}

是否可以在配置中为method1中的log4net.info设置使用一个appender和方法2中的log4net.info来使用另一个appender,即使它们不属于同一类型,例如SmtpAppender。如果是这样,配置看起来如何。这是我的第一次尝试。

<appender name="SMTP1" type="log4net.Appender.SMTPAppender">
</appender>
<appender name="SMTP2" type="log4net.Appender.SMTPAppender">
</appender>


<logger name="MyClass.Method1">
    <level value="INFO" />
    <appender-ref ref="SMTP1" />
</logger>
<logger name="MyClass.Method2">
    <level value="INFO" />
    <appender-ref ref="SMTP2" />
</logger>

2 个答案:

答案 0 :(得分:6)

层次结构基于“名称”。这是什么意思?
好吧,您可以在logger xml中指定一个命名空间(例如Foo.Bar),然后使用GetLogger方法获取该命名空间中的类的记录器,该方法需要TypeFoo.Bar下的任何“子”命名空间都将继承Foo.Bar的记录器配置 或者,您可以使用GetLogger方法根据任何旧字符串获取记录器,该方法需要string

您可以通过几种不同的方式获取记录器。最值得注意的是,Typestring

能够通过string获取,你真的可以将你的记录器命名为任何东西并使用任何东西获取它们。您当前拥有的内容将无法正常工作,因为log4net将根据类获取记录器...因此您将对这两种方法使用相同的记录器。

要做什么,你必须创建两个记录器:

public class MyClass
{
  private static readonly ILog log = LogManager.GetLogger(typeof(MyClass).Name + "." + "Method1");
  private static readonly ILog log2 = LogManager.GetLogger(typeof(MyClass).Name + "." + "Method2");

  public void Method1()
  {
    log.info("message");
  }

  public void Method2()
  {
    log2.info("message");
  }
}

以下是相同的logger xml文件:

<logger name="MyClass.Method1">
    <level value="INFO" />
    <appender-ref ref="SMTP1" />
</logger>
<logger name="MyClass.Method2">
    <level value="INFO" />
    <appender-ref ref="SMTP2" />
</logger>

我对.Net没有太多经验,所以也许有人可以找到一种更好/更强大的方法来使用一些忍者反射来获取每种方法的记录器,但这是我能做的最好的。

答案 1 :(得分:6)

同一记录器无法根据当前方法路由到多个appender,至少不能直接路由。但是,您可以使用log4net的过滤器

做你想做的事。 log4net框架使用您需要的location information(例如,方法名称)填充每个LoggingEvent以进行所需的过滤。但是,您可能需要编写自定义IFilter来过滤它。 IFilter是一个非常简单的实现接口:1 method / 1property。您的过滤器的Decide()方法会对传递给它的每个日志记录事件做出3个决策中的1个:

  • 拒绝。删除日志记录事件。事件未记录,并且不会查询appender的过滤器链中的后续过滤器。
  • 中性。 logging事件将传递给该appender的过滤器链中的下一个过滤器。
  • 接受。记录该事件。不会查询过滤器链中的后续过滤器。

然后将您的过滤器添加到您想要拥有的每个追加者的过滤器链中。这可以在运行中完成,也可以通过log4net.config进行配置。

但是,您应该知道,您获得的位置信息的质量取决于它是调试还是发布版本......以及我相信它是否有可用的调试符号。

您可能还想查看log4net的各种上下文(和上下文堆栈)

如果您需要添加一些基于过滤的上下文信息。