Log4net LogicalThreadContext не работает должным образомC#

Место общения программистов C#
Anonymous
Log4net LogicalThreadContext не работает должным образом

Сообщение Anonymous »

Я пытался использовать Log4nets LogicalThreadContext для предоставления контекста каждой записи журнала. Мое приложение довольно активно использует async/await, но, судя по чтению различных статей, LogicalThreadContext должен правильно работать с асинхронным кодом, начиная с .NET 4.5. Я использую .NET 4.5.1 и log4net 2.0.3

Я наткнулся на отличную статью Стивена Клири о ведении журналов и .NET CallContext, и в результате Я решил взять его код и адаптировать его для использования log4net, чтобы попытаться выяснить, нет ли в моем коде чего-то неправильного, что могло вызвать проблему.

Во-первых , я запустил код Стивенса точно так же и получил ожидаемый результат:

Код: Выделить всё

Main 1: 
Main 1 A: 
Main 2: 
Main 2 A: 
Main 1 A: 
Main 1 B: 
Main 2 A: 
Main 2 B: 
Main 2 B: 
Main 2: 
Main 1 B: 
Main 1: 
Затем я изменил код, чтобы использовать log4net вместо пользовательского MyStack Стивена

Код: Выделить всё

internal class Program
{
private static readonly ILog Log = LogManager.GetLogger(typeof(Program));
private const string StackName = "test";

private static void Main(string[] args)
{
XmlConfigurator.Configure();

using (LogicalThreadContext.Stacks[StackName].Push("Main"))
{
Task.WhenAll(SomeWork("1"), SomeWork("2")).Wait();
}

Console.ReadKey();
}

private static async Task SomeWork(string stackName)
{
using (LogicalThreadContext.Stacks[StackName].Push(stackName))
{
Log.Info("");
await MoreWork("A");
await MoreWork("B");
Log.Info("");
}
}

private static async Task MoreWork(string stackName)
{
using (LogicalThreadContext.Stacks[StackName].Push(stackName))
{
Log.Info("");
await Task.Delay(10);
Log.Info("");
}
}
}
Я ожидал получить тот же результат, что и раньше, но вместо этого на этот раз получил следующее

Код: Выделить всё

Main 1: 
Main 1 A: 
Main 1 A 2: 
Main 1 A 2 A: 
Main 1 A 2 A: 
Main 1 B: 
Main 1 B: 
Main 1 B B: 
Main 1 B B: 
Main 1 B: 
Main 1: 
Main 1: 
Обратите внимание, что отдельные контексты логических потоков начинают перекрываться. Это указывает на то, что log4net неправильно использует CallContext, но судя по всему, что я могу найти, похоже, что они уже исправили все проблемы, связанные с этим.

Кто-нибудь еще сталкивались с этим или знаете, почему это может происходить?

Подробнее здесь: https://stackoverflow.com/questions/233 ... s-expected

Вернуться в «C#»