Log4Net 的 ThreadContext 和 Task 之间的冲突

Conflict between Log4Net's ThreadContext and Task

有没有人尝试过堆叠上下文并同时使用任务?

我正在尝试这样的事情:

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 堆栈的访问权限。

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

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

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

可见