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
可见
有没有人尝试过堆叠上下文并同时使用任务?
我正在尝试这样的事情:
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