自动记录传递给某个方法的所有参数

时间:2013-02-18 15:15:18

标签: c# log4net

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

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

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

3 个答案:

答案 0 :(得分: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框架,您应该能够连接各个组件。

注意事项:

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

答案 1 :(得分:0)

不知道什么是log4net,但你可以使用反射来获取运行时数据或调试功能,然后保存它,阅读更多here

答案 2 :(得分:0)

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