2014-10-27 61 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即可。