2012-09-28 36 views
4

我有一个应用程序(自主托管ASP.Net WebAPI的控制台应用程序)作为其设置的一部分调用XmlConfigurator.Configure()如果我的配置文件缺少log4net配置节,为什么我的应用程序会挂起?

它工作正常,如果我的应用程序的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)。

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

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

stack trace

+0

如果单步执行代码会发生什么? – Default

+0

它可能不是log4net中的错误,它可能是MS配置解析器。 –

+0

您同意这是一个错误。在这种情况下,它可能会弹出一些静态构造函数,不可能让你捕捉。 –

回答

4

我得到的这个底部到底感谢中this blog post

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

在我的配置文件中没有空的<log4net>元素,log4net想要写入标准错误以通知元素为空。没有这个元素,就不会发生记录。当日志记录发生时(发生在与应用程序中其他控制台使用不同的线程中)时,会发生由.NET 4中控制台初始化更改所导致的死锁。5(在链接的博客文章中有详细介绍)。

+0

你能解释一下你接受的答案吗?你做了什么来解决它? – MikroDel

+1

@MikroDel:我确保了我的应用程序有日志记录配置。这样,并没有一个空的''元素,所以没有尝试登录到控制台,这是导致死锁的原因。 – adrianbanks

+0

感谢您的回复。我有几乎相同的问题[问题](http://stackoverflow.com/questions/17468841/log4net-configuration-failed-to-find-section)我有** web.config **和3配置调试,测试和发布。那个是空的。这可能是问题吗?无论如何,如果你有一个想法 - 请把它作为我的问题的答案。我把它投票,如果它解决了我的错误信息 - 接受它 – MikroDel

0

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

+0

以前我有其他的应用程序没有演示这种行为,包括配置log4net但没有定义配置部分的应用程序。为配置节定义处理程序并不意味着该节必须存在。 – adrianbanks

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> 
+1

我可以使它与配置一起工作,那不是问题。我更感兴趣的是为什么它的行为与我过去曾经使用log4net的其他应用程序有所不同。 – adrianbanks

+0

我道歉我最初可能还没有理解你的问题。 – MethodMan

相关问题