gpt4 book ai didi

c# - 如果我的配置文件缺少 log4net 配置部分,为什么我的应用程序会挂起?

转载 作者:太空狗 更新时间:2023-10-30 01:22:52 25 4
gpt4 key购买 nike

我有一个应用程序(一个自托管 ASP.Net WebAPI 的控制台应用程序)正在调用 XmlConfigurator.Configure() 作为其设置的一部分。

如果我的应用程序的 app.config 它工作正常文件看起来像这样:

<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>

<log4net>
</log4net>
</configuration>

如果我取出空的 <log4net> 它会挂起元素:

<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
</configuration>

过去使用 log4net 时,我在其他任何地方都没有看到这种行为(它通常只是将消息“log4net:错误 XmlConfigurator:无法在应用程序的 .config 文件中找到配置部分‘log4net’。”输出到控制台)。

我做错了什么,还是我偶然发现了 log4net 中的错误?


我已经对此进行了广泛的调试。有两种行为:

  1. 调用XmlConfigurator.Configure()当我跨过它时会无限期地挂起
  2. 调用XmlConfigurator.Configure()可以跨过,但随后应用程序似乎挂起。如果我暂停执行并查看事件线程,就会发现有一个线程卡在 log4net 方法中(类似 ConfigureFromFile )。

无论哪种方式,它都会挂起整个应用程序。

这是挂起线程的堆栈跟踪(在上面的第二种情况下):

stack trace

最佳答案

多亏了this blog post,我终于弄清楚了这个问题.

基本上可以归结为我的机器上安装了 .Net 4.5。尽管我的目标是 .Net 4.0,但由于 .Net 4.5 的直接替换性质,行为有所不同。

不带空<log4net>我的配置文件中的元素,log4net 想要写入标准错误以通知该元素为空。如果没有该元素,则不会发生日志记录。当日志记录确实发生时(发生在与应用程序中其他控制台使用不同的线程上),它会遇到死锁,这是由 .Net 4.5 中控制台初始化方式的变化引起的(在链接的博客文章中有详细说明)。

关于c# - 如果我的配置文件缺少 log4net 配置部分,为什么我的应用程序会挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12640553/

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