я бы сделал следующее:
Сначала определите помощника по ведению журнала
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"/>
Я использую этот метод для регистрации большого количества материала, который необходимо рассчитать и определить для конкретного приложения.
Возможно, вы захотите добавить некоторую логику для использования длинного числа для очень длинных периодов, а также некоторое форматирование для нумерации строк (например, заполнение нулями слева и т. Д.) ...
Хорошее ведение журнала!
EDIT:
Решение, которое я здесь представляю, должно использоваться только для одного файла журнала одновременно. Если вы используете этот шаблон во многих файлах журнала, у вас будет уникальный номер строки в каждом , если вы добавите защиту от условий гонки (просто добавьте synclock
в метод tostring объекта-помощника)
Для управления несколькими регистраторами с номером строки следует использовать другой метод
EDIT # 2:
Обновлен, чтобы быть потокобезопасным, также обновлен, чтобы поделиться именами идентификаторов с принятым ответом для удобства читателей (легче переваривать и сравнивать.)