2017-01-11 43 views
2

我在我的解決方案的根目錄中有一個文件log4net.xml。用於複製到bin的文件屬性設置爲Always copy。我已確認該文件複製到bin目錄。爲什麼log4net配置文件沒有被讀取

內,我已經建立了一個文件的appender(基本上是從本文檔的複製粘貼)的配置:

<appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> 
<file value="Logs\\log.log" /> 
<appendToFile value="true" /> 
<rollingStyle value="Date"/> 
<datePattern value="yyyyMMdd-HHmmss" /> 
<layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
</layout> 
</appender> 

我也有這條線在AssemblyInfo.cs

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.xml", Watch = true)] 

和伐木者正在建立像這樣的代碼文件:

private static ILog LOGGER = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

我加了log4net.Config.XmlConfigurator.Configure();(還有FileInfo參數)到主要Program.cs

但是,如果我執行該程序不會創建預期的日誌文件。我懷疑log4net甚至沒有讀取配置文件。

我錯過了什麼嗎?從VS內部執行也不起作用(雖然它以某種方式拾取了控制檯Appender的一部分)。

類似的帖子:

感謝。

編輯

所以我得到這個從文檔刪除複製/粘貼部分VS工作:

<root> 
    <level value="DEBUG" /> 
    <appender-ref ref="A1" /> 
</root> 

然而,從EXE運行仍然不工作

+1

這可能是一個路徑問題 - 在配置文件中有「Logs \\ log.log」,它應該是「Logs \ log.log」 - 不需要在配置文件值中轉義\ 。 – Tim

+0

權限也可以發揮作用 - 運行程序的用戶需要創建文件和寫入權限才能成功登錄到文件 – dbugger

回答

0

我工作了這一點,我不知道這是否是正確的修復 - 我不知道爲什麼它在VS一次得手 - 但我認爲這只是配置文件未正確配置。

首先,由於在AssemblyInfo.cs中存在文件聲明,所以不需要log4net.Config.XmlConfigurator.Configure();

其次,我索性就都附加目的地添加到根標籤:

<root> 
<level value="DEBUG" /> 
<appender-ref ref="A1" /> 
<appender-ref ref="RollingFile" /> 
</root> 

就是這樣。控制檯上的VS輸出以及文件,EXE輸出到文件。

0

我認爲這個問題可能與配置文件中的路徑中的雙重\\有關。鑑於當您在Visual Studio中運行該程序並且控制檯Appender部件工作時,這似乎表明配置文件正在被讀取,但它無法寫入文件,因爲該路徑無效。我對Log4Net並不熟悉,所以我不知道無效路徑是否會拋出異常 - 它可能會被吞噬。

試着在你的配置文件的值更改爲一個反斜槓,像這樣:

<file value="Logs\log.log" /> 
+0

謝謝,我確實找到了答案,它確實看起來像log4net非常聰明,可以忽略雙倍\ - 當'root'配置正確時,兩者都可以正常工作 –

3

最簡單方法是調試log4net的錯誤就是把它們記錄到文件中C:\tmp\log4net.txt下。 這不會回答你原來的問題,但它會給你一個線索在哪裏尋找。

How do I enable log4net internal debugging?

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
     <add key="log4net.Internal.Debug" value="true"/> 
    </appSettings> 
</configuration> 

<configuration> 
    ... 

    <system.diagnostics> 
     <trace autoflush="true"> 
      <listeners> 
       <add 
        name="textWriterTraceListener" 
        type="System.Diagnostics.TextWriterTraceListener" 
        initializeData="C:\tmp\log4net.txt" /> 
      </listeners> 
     </trace> 
    </system.diagnostics> 

    ... 
</configuration> 
+0

謝謝,1有用的提示! –

相關問題