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

时间:2012-09-28 13:01:39

标签: c# .net log4net

我有一个应用程序(一个自托管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:ERROR XmlConfigurator:在应用程序的.config文件中找不到配置部分'log4net'。”控制台)。

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


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

  1. 当我跨过它时,对XmlConfigurator.Configure()的呼叫无限期挂起
  2. 可以逐步调用XmlConfigurator.Configure(),但应用程序似乎挂起了。如果我暂停执行并查看活动线程,那么有一个卡在log4net方法中(类似于ConfigureFromFile)。
  3. 无论哪种方式,它都会挂起整个应用程序。

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

    stack trace

3 个答案:

答案 0 :(得分:4)

由于this blog post,我最终得到了这一点。

它基本上归结为我在我的机器上安装了.Net 4.5。即使我的目标是.Net 4.0,但由于.Net 4.5的替换性质,性能也不同。

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

答案 1 :(得分:0)

您的配置告诉XmlConfigurator管理器有一个名为Log4Net的部分。 所以你的XmlConfigurator试图加载该部分并抱怨 我敢说这是可以预料的 如果删除configSections中声明的任何部分,您将获得与任何派生的Configuration类相同的行为。

答案 2 :(得分:0)

尝试这样的事情,我在我的.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>