2014-10-27 80 views
1

我嘗試使用Log4Net與Unity和攔截...它看起來像一切應該工作,但不......我有兩個問題...我認爲用一個解決方案。 當我登錄到文件時,我應該記錄我正在登錄的方法。逸岸,我有這樣的配置:如何使用Log4Net與攔截(MS Unity)

<appender name="MyFileAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
    <layout type="log4net.Layout.PatternLayout"> 
    <!-- %d = date, %t = thread, %p = level, %m = message, %n = new line --> 
    <param name="ConversionPattern" value="%d{dd/MMM/yyyy HH:mm:ss} [%t] %-2p - %M %m%n"/> 
    </layout> 
</appender> 

在模式我有%M,這應該是我打電話的方法...但我使用的攔截與統一,因此,所記錄的方法名是INVOKE:

var result = getNext().Invoke(input, getNext); 

這是通過反射調用我的真實方法的方法。那麼如何使用log4Net的PatternLayout來解決這個問題呢?可能嗎? 我的第二個問題,我應該有兩個不同的附加目的地......我將創建一個記錄器名爲MyNamespace.[MyClass].[MyMethod]

<logger name="MyNamespace.MyClass.MyMethod"> 
    <level value="ERROR" /> 
    <appender-ref ref="WebsiteFileAppender" /> 
</logger> 

但這不能正常工作,因爲,對於log4net的,我記錄的另一種方法,即是invoke,而不是我真正的方法。我希望一切都很清楚。

任何人都可以幫助我嗎?

謝謝

回答

1

自定義屬性只是添加到您的log4net線程與要登錄和登錄模式這個屬性的方法的名稱。

log4net.ThreadContext.Properties[ "myMethod" ] = theRealMethod; 

,並在配置

<conversionPattern value="%logger (%property{myMethod}) [%level]- %message%newline" /> 

關於你提到的第二點,log4net的不基於方法名不附加目的地的路線,但在類名停止。如果您只想記錄某種方法發出的事件,只需在您定義的定製屬性上使用帶有PropertyFilter的LogFilter即可。