【问题标题】:Why would my application hang if my config file is missing a log4net configuration section?如果我的配置文件缺少 log4net 配置部分,为什么我的应用程序会挂起?
【发布时间】:2012-09-28 13:01:39
【问题描述】:

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

如果我的应用程序的 app.config 文件如下所示,它可以正常工作:

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

    <log4net>
    </log4net>
</configuration>

如果我取出空的@9​​87654327@ 元素,它会挂起:

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

在过去使用 log4net 时,我在其他任何地方都没有看到过这种行为(它通常只是将消息“log4net:ERROR XmlConfigurator: Failed to find configuration section 'log4net' in the application's .config file.”放到控制台)。

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


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

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

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

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

【问题讨论】:

  • 单步执行代码会发生什么?
  • 这可能不是 log4net 中的错误,它可能是 MS 配置解析器。
  • 您同意这是一个错误。在这种情况下,它可能会在一些静态构造函数中弹出,你无法捕捉到。
  • 看来您的 log4net 配置设置设置错误..我将发布一个示例,说明我的 log4net 工作版本目前在我的企业 Web 应用程序上如何为我工作
  • 挂起很容易诊断。 Debug + Break All 并查看调用堆栈。如果这没有帮助,请将其发布在您的问题中。顺便说一句,NLog 是更好的端口。

标签: c# .net log4net


【解决方案1】:

感谢this blog post,我终于找到了真相。

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

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

【讨论】:

  • 你能解释一下你接受的答案吗?你做了什么来解决它?
  • @MikroDel:我确保我的应用程序有日志记录配置。这样一来,就没有空的&lt;log4net&gt; 元素,因此没有尝试登录到控制台,这就是死锁的原因。
  • 感谢您的回复。我有几乎相同的问题question 我有 web.config 和 3 个用于调试、测试和发布的配置。一个是空的。这可能是问题吗?无论如何,如果你有一个想法 - 请在我的问题中发布它作为答案。我会投票赞成,如果它解决了我的错误消息 - 接受它
【解决方案2】:

您的配置告诉 XmlConfigurator 管理器有一个名为 Log4Net 的部分。 因此,您的 XmlConfigurator 会尝试加载该部分并抱怨。
我敢说这是意料之中的。
如果您删除在 configSections 中声明的任何部分,您将获得与任何派生配置类相同的行为。

【讨论】:

  • 过去我有其他应用程序没有展示这种行为,包括那些配置 log4net 但没有定义配置部分的应用程序。为配置部分定义处理程序并不意味着该部分必须存在。
【解决方案3】:

尝试这样的事情,我在我的 .config 文件之后 设置

在你的页面中声明这样的内容

private static log4Net.ILog _logger = log4net.LogManager.GetLoggger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);


  <log4net>
    <root>
      <level value="ALL"/>
      <appender-ref ref="LogFileAppender"/>
    </root>
    <appender name="LogFileAppender"  type="log4net.Appender.RollingFileAppender,log4net">
    <param name="File value="c:\Logs\SampleLog.txt"/>
    <param name="AppendToFile value="true"/>
    <rollingStyle value="Size"/>
    <maximumFileSize value="2MB"/>
    <staticLogFileName value="false"/>
    <datePattern value="yyyyMMdd"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger -%message%newline"/>
      </layout>
    </appender>
  </log4net>

【讨论】:

  • 我可以让它与配置一起工作,这不是问题。我更感兴趣的是为什么它的行为与我过去使用 log4net 的所有其他应用程序不同。
  • 抱歉,我最初可能没有理解您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多