如何使用Log4Net进行拦截(MS Unity)

时间:2014-10-27 16:04:42

标签: reflection log4net unity-container unity-interception

我尝试使用Log4Net与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的模式中,这应该是我正在调用的方法......但是我使用Unity进行拦截,因此,记录的方法名称是INVOKE:

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

这种方法通过反射调用我的真实方法。那么如何使用log4Net的PatternLayout来解决这个问题呢?可能吗? 我的第二个问题,我应该有两个不同的appender ...我会创建一个名为MyNamespace.[MyClass].[MyMethod]的记录器

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

但这不起作用,因为对于log4net,我正在记录另一种方法,即invoke,而不是我的实际方法。我希望一切都清楚。

有人可以帮我吗?

谢谢

1 个答案:

答案 0 :(得分:1)

只需使用您要记录的方法的名称将自定义属性添加到log4net线程,并在模式中记录此属性。

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

并在配置

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

关于第二点,log4net不会根据方法名称路由appender,而是在类名称处停止。如果您只想记录来自一种方法的一些事件,只需在您定义的自定义属性上使用带有PropertyFilter的LogFilter