2011-04-21 34 views
1

我找到一個bug在這裏,還是我做錯了這個配置?log4net的記錄器的層次結構有類似的日誌根名稱

<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%message%newline" /> 
    </layout> 
</appender> 
<logger name="MyApp.Common"> 
    <level value="WARN" /> 
    <appender-ref ref="ConsoleAppender" /> 
</logger> 
<logger name="MyApp.Common.Namespace.SomeGenericClass`1"> 
    <level value="INFO" /> 
    <appender-ref ref="ConsoleAppender" /> 
</logger> 

。假定我命名我的記錄器根據標準「...... DeclaringType」命名方案,我的期望是這裏的MyApp.Common命名空間下,一切都會得到,只要它是登錄到控制檯WARN或更高。 SomeGenericClass`1中的任何內容如果它是INFO或更高,都會被記錄(如果是WARN記錄器,則會記錄兩次WARN或更高)。

發生什麼事是SomeGenericClass`1中獲取登錄信息的任何東西將被管道輸出到控制檯兩次,而不是預期的一次。如果我刪除更具體的記錄器,則不會記錄任何內容,如果我刪除了不太特定的記錄器,則只會記錄一次,這兩個都如預期的那樣。另外,在配置文件中反轉記錄器的順序不會產生任何效果(正如我所期望的那樣,因爲我猜測順序無關緊要)。

難道我在這裏找到了一個bug,還是我失去了一些東西在層次結構中是如何工作的重要?

回答

0

我想這應該做你想要的(沒有測試):

<logger name="MyApp.Common"> 
    <level value="WARN" /> 
    <appender-ref ref="ConsoleAppender" /> 
</logger> 
<logger name="MyApp.Common.Namespace.SomeGenericClass`1"> 
    <level value="INFO" /> 
</logger> 

沒有必要再引用附加器,除非你設置additivity false時自動繼承。

2

我使用多個記錄器節點實驗的經驗是,log4net的將使用在任何特定記錄器設置的最低水平。所以,即使你指定在MyApp.Common WARN,使用MyApp.Common.SomeGenericClass信息引起了全球的(?)級別設置下降到WARN。所以你從MyApp.Common以及MyApp.Common.SomeGenericClass獲得了一個條目,因爲appender ConsoleAppender被激發了兩次。

我是什麼後,得到日誌的一個子集去到一個單獨的文件。並不完全是你在說你的問題,但它確實涵蓋了你想要做的事情。我確實希望將我的解決方案記錄在某處,我可以爲了自己的利益再次找到它;-)。

我創建了兩個不同的記錄器如您有以上,雖然一個是根,將工作一樣。然後我創建了兩個不同的appender,每個appender根據不同的錯誤級別進行過濾,並在兩個記錄器中分別引用它們。我得到的是來自OtherNamespace的日誌在一個文件中,而其他所有文件都在其中。代碼如下。

<log4net> 
<logger name="OtherNamespace"> 
    <appender-ref ref="OtherNamespaceAppender"/> 
</logger> 
<root> 
    <level value="WARN"/> 
    <appender-ref ref="MyRollingFileAppender"/> 
</root> 
<appender name="MyRollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file type="log4net.Util.PatternString" value="C:\Comanche\mylogfileFor_%property{User}.log" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <threshold value="ERROR" /> 
    <countDirection value="3" /> 
    <maxSizeRollBackups value="2" /> 
    <maximumFileSize value="200KB" /> 
    <staticLogFileName value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <param name="ConversionPattern" value="%-6level%utcdate{ABSOLUTE} – %location :: %message%newline" /> 
    </layout> 
</appender> 
<appender name="OtherNamespaceAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="C:\Comanche\OtherNamespace.log" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <threshold value="WARN" /> 
    <countDirection value="3" /> 
    <maxSizeRollBackups value="2" /> 
    <maximumFileSize value="200KB" /> 
    <staticLogFileName value="true" /> 
    <filter type="log4net.Filter.LoggerMatchFilter"> 
    <acceptOnMatch value="true" /> 
    <LoggerToMatch value="OtherNamespace" /> 
    <!-- set your class name here --> 
    </filter> 

    <filter type="log4net.Filter.DenyAllFilter" /> 

    <layout type="log4net.Layout.PatternLayout"> 
    <param name="ConversionPattern" value="%-6level%utcdate{ABSOLUTE} :: %message%newline" /> 
    </layout> 
</appender> 

要知道,「一切」是在另一個空間中,因此它沒有得到轉移到了OtherNamespace記錄儀,它可以有,如果有將是某種形式的名稱相匹配。還要注意,因爲所有東西都是從根繼承的,所以如果我已經將root引用的appender的日誌記錄級別更改爲WARN,那麼我也會得到OtherNamespace日誌。我想要實現的目標是讓更詳細的日誌記錄轉到其他文件的其他文件。