4

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

如果我的应用程序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: Failed to find configuration section 'log4net' in the application's .config file.”输出到控制台)。

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


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

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

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

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

堆栈跟踪

4

3 回答 3

4

多亏了这篇博文,我终于找到了答案。

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

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

于 2013-02-06T23:37:48.753 回答
0

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

于 2012-09-28T13:08:03.503 回答
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>
于 2012-09-28T13:18:49.123 回答