Log4Net: как добавить простой индексатор (номер строки) в каждую строку журнала

Вот проблема: я хочу добавить индексатор строк (номер строки или итератор) для каждой строки в файле журнала. Мне не нужно, чтобы он был уникальным для всего файла журнала, а только для «сеанса приложения» (т. Е. Каждый раз, когда запускалось приложение Win32, мы начинали обратный отсчет: 1, 2, 3 и т. Д.)

Есть ли какой-либо встроенный способ (синтаксис тега translationpattern) или какое-то пользовательское расширение?

Большое спасибо!

Ответы на вопрос(2)

Во-первых, определите некоторый помощник регистрации

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;
}

Прибыль! или, что более серьезно, теперь вы можете использовать свойство непосредственно в формате log4net с помощью%property{CurrentLine}

<conversionPattern value="%property{CurrentLine}- %date - %identity - %property{current_request_id} - %m%n"/>

Я использую этот метод для регистрации большого количества материала, который необходимо рассчитать и определить для конкретного приложения. Возможно, вы захотите добавить некоторую логику, чтобы использовать длинные числа для очень длинных периодов, и некоторое форматирование для нумерации строк (например, заполнение нулями слева, и т. Д.) ...

Хорошая регистрация!

РЕДАКТИРОВАТЬ: Решение, которое я представляю здесь, должно использоваться только для одного файла журнала одновременно. Если вы используете этот шаблон во многих файлах журнала, у вас будет уникальный номер строки в каждомесли Вы добавляете защиту от условий гонки (просто добавьтеsynclock в методе tostring объекта-помощника) Для управления несколькими регистраторами с номером строки следует использовать другой метод

РЕДАКТИРОВАТЬ # 2: Обновлено, чтобы быть потокобезопасным, также обновлен, чтобы поделиться именами идентификаторов с принятым ответом для удобства читателей (легче переваривать и сравнивать.)

Решение Вопроса

и счетчик будет сбрасываться при каждом запуске приложения.

Вы можете использовать конвертер шаблонов:

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 что бы заполнить строку пробелами, чтобы вы правильно выровняли сообщение.

Ваш ответ на вопрос