1

假设我有一些接受两个整数的函数。是否可以自动记录这样的消息 "[Date][MethodNam]([first param],[second param]) - "

到目前为止我尝试了什么 - 指定以下布局模式:

<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] [%C.%M] – %message%newline" />
4

3 回答 3

2

如果您使用的是 Windsor 等 IoC 框架,您可以使用 AOP(面向方面​​的编程)在您的接口周围注入一个包装器。然后,您可以记录方法调用。这是一个使用 Windsor 和 IInteceptor 接口的示例,这是我们使用的精简版本,但有各种可用示例。

public class LoggingInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Type targetType = invocation.TargetType ?? invocation.Method.DeclaringType;

        ILog logger = LogManager.GetLogger(targetType);

        //Probably want to check logger.IsDebugEnabled

        if(invocation.Arguments.Count() == 0)
        {
            logger.DebugFormat("Method '{0}' called.", invocation.Method);
        }
        else
        {
            var stringBuilder = new StringBuilder("{" + invocation.Arguments.Length + "}");

            for (int i = invocation.Arguments.Length - 1; i > 0; i--)
            {
                stringBuilder.Insert( 0, "{" + i + "}, " );
            }

            logger.DebugFormat("Method '{0}' called with parameters: " + stringBuilder, new[] { invocation.Method }.Union(invocation.Arguments).ToArray());
        }

        try
        {
            invocation.Proceed();

            if (invocation.Method.ReturnType != typeof(void))
            {
                logger.DebugFormat("Method '{0}' returned: {1}", invocation.Method, invocation.ReturnValue);
            }
        }
        catch(Exception ex)
        {
            logger.Error(string.Format("Method '{0}' threw exception:", invocation.Method), ex);
            throw;
        }
    }
}

根据您的 IoC 框架,您应该能够连接各个组件。

注意事项:

这仅适用于接口方法,它不会连接对象上的私有方法。

于 2013-02-18T15:35:19.420 回答
0

不知道什么是 log4net,但是您可以使用反射来获取运行时数据或调试功能,然后保存,请在此处阅读更多内容。

于 2013-02-18T15:22:19.660 回答
0

你需要什么,我称之为Aspect Oriented Programming(AOP)是 AOP 框架的列表。不知道是否允许您插入参数记录,但Loom.net看起来很有希望。

于 2013-02-18T15:30:12.613 回答