Conflict between Log4Net's ThreadContext and Task

本文关键字:ThreadContext and Task between Log4Net Conflict | 更新日期: 2023-09-27 18:10:01

是否有人试图同时堆叠上下文和使用任务?

我正在尝试这样做:

using (log4net.ThreadContext.Stacks["contextLog"].Push("Saving Data"))
{
    log.Info("Starting transaction");
    var taskList = new List<Task>();
    taskList.Add(Task.Factory.StartNew(() =>
    {
        log.Info("Inside Transaction");
    }));
    Task.WaitAll(taskList.ToArray());
}

和我得到的结果:

2015/42/26 13:42:10,841 INFO  [Saving Data] Starting transaction
2015/42/26 13:42:10,870 INFO  [(null)] Inside Transaction

我希望在第二行有[Saving Data]而不是[(null)]

一旦启动一个新任务,它似乎就失去了对log4net ThreadContext堆栈的访问权。

你知道如何避免这种情况吗?

编辑:起初我认为这是事务范围的问题,但正如@stuart指出的那样,它工作得很好。然后我意识到有一个任务,这才是真正的问题。

Conflict between Log4Net's ThreadContext and Task

该任务将在不同的线程上运行,因此ThreadContext堆栈中的数据不可用,您应该使用log4net.LogicalThreadContext作为数据,该数据应该遵循逻辑执行,并且仍然对Task可见