log4net自定义日志记录

时间:2010-11-29 18:56:55

标签: c# .net log4net

有人请为这个问题推荐一个更好的标题。我不知道该放什么。

现在我们有一个围绕ILog实例的日志包装器,它将一些文本添加到记录的消息中。我想要做的是实现ILayout或ILogger或IAppender,然后可以在我们的配置XML中指定。我想要的文本不是静态的。因为它在每个日志条目中使用,我们想要实现它一次,而不是在代码中我们生成日志消息的任何地方。

这有意义吗?我应该实现哪个界面?现在我们使用PatternLayout。

3 个答案:

答案 0 :(得分:4)

这取决于您计划如何重复使用它(例如,使用多个appender时),但由于您要更改日志消息的 text ILayout听起来像是最好的选择。

您可以继承PatternLayout并在Format中完成您的工作。

答案 1 :(得分:2)

我同意实现自定义PatternLayoutConverter。这里有几个例子:

这个将System.Diagnostics.Trace.CorrelationManager.ActivityId添加到输出中:

  public class ActivityIdLayoutConverter : PatternLayoutConverter
  {
    protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent)
    {
      writer.Write(Trace.CorrelationManager.ActivityId.ToString());
    }
  }

这个是参数化的(它可以配置一个键,可以用来从字典中检索一个值 - 类似于GDC或MDC):

  class KeyLookupPatternConverter : PatternLayoutConverter
  {
    protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent)
    {
      string setting;
      //Option is the key name specified in the config file
      if (SomeDictionaryWithYourValues.TryGetValue(Option, out setting))
      {
        writer.Write(setting);
      }
    }
  }

Here is a link我问过有关创建可以获取键值的PatternLayoutConverter的问题。它显示了如何在log4net和NLog中执行此操作以及如何配置。

或者,您可以包装一个log4net记录器,并且在您的包装器的“Log”方法中,您可以修改输入消息,或者您可以将自定义值放在GlobalDiagnosticContext.Properties或ThreadDiagnosticContext.Properties中,然后引用输出中的值通过普通的属性令牌方法。

答案 2 :(得分:0)

您可能希望在应用上使用依赖注入,您可以将更改后续记录的方式更改为您想要的任何一种。