gpt4 book ai didi

c# - Log4net LogicalThreadContext 未按预期工作

转载 作者:太空狗 更新时间:2023-10-29 17:43:17 26 4
gpt4 key购买 nike

我一直在尝试使用 Log4nets LogicalThreadContext 为我的每个日志条目提供上下文。我的应用程序大量使用 async/await,但从阅读各种文章来看,LogicalThreadContext 应该可以与异步代码一起正常工作,从 .NET 4.5 开始。我正在使用 .NET 4.5.1 和 log4net 2.0.3

我遇到了一个很棒的article Stephen Cleary 关于日志记录和 .NET CallContext 的文章,因此我决定采用他的代码并对其进行调整以使用 log4net,以尝试查看我的代码中是否存在可能导致问题的错误。

首先,我按原样运行 Stephens 代码并得到预期的输出

Main 1: <SomeWork>
Main 1 A: <MoreWork>
Main 2: <SomeWork>
Main 2 A: <MoreWork>
Main 1 A: </MoreWork>
Main 1 B: <MoreWork>
Main 2 A: </MoreWork>
Main 2 B: <MoreWork>
Main 2 B: </MoreWork>
Main 2: </SomeWork>
Main 1 B: </MoreWork>
Main 1: </SomeWork>

接下来,我修改了代码以使用 log4net 而不是 Stephens 自定义 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("<SomeWork>");
await MoreWork("A");
await MoreWork("B");
Log.Info("</SomeWork>");
}
}

private static async Task MoreWork(string stackName)
{
using (LogicalThreadContext.Stacks[StackName].Push(stackName))
{
Log.Info("<MoreWork>");
await Task.Delay(10);
Log.Info("</MoreWork>");
}
}
}

我希望得到与以前类似的输出,但这次我得到了以下结果

Main 1: <SomeWork>
Main 1 A: <MoreWork>
Main 1 A 2: <SomeWork>
Main 1 A 2 A: <MoreWork>
Main 1 A 2 A: </MoreWork>
Main 1 B: <MoreWork>
Main 1 B: </MoreWork>
Main 1 B B: <MoreWork>
Main 1 B B: </MoreWork>
Main 1 B: </MoreWork>
Main 1: </SomeWork>
Main 1: </SomeWork>

注意独立的逻辑线程上下文开始重叠。这向我表明 log4net 没有正确使用 CallContext,但从我能发现的一切来看,他们似乎已经解决了与此相关的任何问题。

有没有其他人遇到过这种情况或知道为什么会发生这种情况?

最佳答案

不幸的是,看起来 log4net 仍然 不适用于async 逻辑堆栈。

log4net NuGet 包 2.0.3 是 log4net 1.2.13(截至今天的当前版本)。报告了一个错误 (LOG4NET-317),因为当时 LogicalThreadContext 使用 CallContext 而不是 LogicalCallContext

current version of LogicalThreadContext确实使用 LogicalThreadContext,但是 current version of ThreadContextStacks 没有正确使用不可变堆栈。

有趣的是,Andrew Arnott correctly pointed out in the original bug report that they had to use an immutable stack . 2011年。

随意编写一个最小的重现并将其报告为 log4net 错误。关键场景是在使用 Task.WhenAll 组合的多个任务中使用堆栈。

关于c# - Log4net LogicalThreadContext 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23316743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com