有人请为这个问题推荐一个更好的标题。我不知道该放什么。
现在我们有一个围绕ILog实例的日志包装器,它将一些文本添加到记录的消息中。我想要做的是实现ILayout或ILogger或IAppender,然后可以在我们的配置XML中指定。我想要的文本不是静态的。因为它在每个日志条目中使用,我们想要实现它一次,而不是在代码中我们生成日志消息的任何地方。
这有意义吗?我应该实现哪个界面?现在我们使用PatternLayout。
答案 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)
您可能希望在应用上使用依赖注入,您可以将更改后续记录的方式更改为您想要的任何一种。