2010-11-29 166 views
1

有人请为这个问题推荐一个更好的标题。我不知道要放什么。log4net自定义日志记录

现在我们围绕一个ILog实例提供了一个日志包装,它将一些文本添加到记录的消息中。我想要做的是实现ILayout或ILogger或IAppender,然后可以在我们的配置XML中指定它。我想预先考虑的文本不是静态的。因为它被用在每个日志条目中,所以我们希望一次实现它,而不是在代码中的任何地方写日志消息。

这是否有意义?我应该实现哪个接口?现在我们使用PatternLayout。

+0

你看过MS企业库日志记录应用程序块吗? – mcass20 2010-11-29 19:04:22

+0

不,但我们一直在使用log4net几年,并对此感到满意。 – Amy 2010-11-29 19:30:33

回答

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):给我询问有关创建PatternLayoutConverter,可以采取一个键值的问题

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。它显示了如何在log4net和NLog中执行以及如何配置。

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

4

这取决于你打算如何(例如使用多个附加目的地时)重新使用它,但因为要更改日志消息的文本ILayout听起来就像是最好的选择。

你可以继承PatternLayout,并在Format做你的东西。

0

您可能想要在应用程序上使用依赖注入,您可以稍后更改日后记录的方式。