问题在于: 我想在日志文件中的每一行添加行索引器(行号或迭代器)。 我不需要它对于整个日志文件是唯一的,但仅适用于“应用程序会话”(即每次Win32应用程序启动时,我们开始倒计时:1,2,3等等)
是内置方式(转换模式标记语法)还是某些自定义扩展?
非常感谢!
答案 0 :(得分:10)
我的解决方案仅适用于一个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());
}
}
然后你这样配置:
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%LC] %message%newline" />
<converter>
<name value="LC" />
<type value="YourNameSpace.LineCounterPatternConverter" />
</converter>
</layout>
[]括号当然是可选的。你也可以做这样的事情%6LC
,它会用空格填充行,这样你就能很好地对齐消息。
答案 1 :(得分:1)
我会做以下事情:
首先,定义一些日志助手
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}
<conversionPattern value="%property{CurrentLine}- %date - %identity - %property{current_request_id} - %m%n"/>
我使用此方法记录需要计算和特定于应用程序的大量内容。 您可能希望添加一些逻辑以在很长时间内使用长数字,并对行编号进行一些格式化(例如在左侧填充零填充等)...
记录良好!
编辑:
我在此处提供的解决方案一次只能用于一个日志记录文件。我在许多日志文件中使用此模式,每个中都有一个唯一的行号,如果你添加了针对竞争条件的保护(只需在帮助器的tostring方法中添加synclock
宾语)
要使用行号管理多个记录器,应使用另一种方法
编辑#2: 更新为线程安全,也更新为共享标识符名称与接受的答案,以便读者受益(更容易消化和比较。)