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

时间:2010-10-04 08:26:20

标签: c# .net logging log4net

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

是内置方式(转换模式标记语法)还是某些自定义扩展?

非常感谢!

2 个答案:

答案 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}

直接在log4net格式中使用该属性
<conversionPattern value="%property{CurrentLine}- %date - %identity - %property{current_request_id} - %m%n"/>

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

记录良好!


编辑: 我在此处提供的解决方案一次只能用于一个日志记录文件。我在许多日志文件中使用此模式,每个中都有一个唯一的行号,如果你添加了针对竞争条件的保护(只需在帮助器的tostring方法中添加synclock宾语) 要使用行号管理多个记录器,应使用另一种方法

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

相关问题