Log4Net:如何向每个日志行添加简单的索引器(行号)

这是问题:我想在日志文件中的每一行添加行索引器(行号或迭代器)。 我不需要它对整个日志文件是唯一的,但仅适用于“应用程序会话”(即每次Win32应用程序启动时,我们开始倒计时:1,2,3等等)

是内置方式(conversionpattern标记语法)还是一些自定义扩展?

非常感谢!

我的解决方案仅适用于一个appender,每次启动应用程序时都会重置计数器。

你可以使用模式转换器:

public sealed class LineCounterPatternConverter : PatternLayoutConverter { private static int _counter = 0; protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { var counter = System.Threading.Interlocked.Increment(ref _counter); writer.Write(counter.ToString()); } } 

然后你像这样配置它:

        

[]括号当然是可选的。 你也可以做类似这样的%6LC ,它会用空格填充行,这样你就能很好地对齐消息。

我会做以下事情:

首先,定义一些日志助手

 public class WebLoggingHelper { public static CurrentLineHelper CurrentLine = new CurrentLineHelper(); public class CurrentLineHelper { private long _counter = 0; public override string ToString() { long counter = System.Threading.Interlocked.Increment(ref _counter); return counter.ToString(); } } } 

然后将日志记录助手连接到初始化记录器的位置的log4net属性

 public void ConfigureLog4Net() { XmlConfigurator.Configure(); GlobalContext.Properties["CurrentLine"] = WebLoggingHelper.CurrentLine; } 

利润! 或者更严重的是,现在您可以使用%property{CurrentLine}直接在log4net格式中使用该%property{CurrentLine}

  

我使用这种方法来记录需要计算和特定于应用程序的大量内容。 您可能需要添加一些逻辑以在很长时间内使用长数字,并对行编号进行一些格式化(例如,在左侧填充零填充等)…

好记录!


编辑:我在这里提出的解决方案一次只能用于一个日志文件。 我在许多日志文件中使用此模式, 如果添加针对竞争条件的保护,则每个都有一个唯一的行号(只需在辅助对象的tostring方法中添加一个synclock )管理多个带有行号的记录器,另一个应该使用方法

编辑#2:更新为线程安全,也更新为共享标识符名称和接受的答案,以便读者受益(更容易理解和比较。)