2012-09-28 23 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

相關問題