AOP(面向方面​​编程)和日志记录。它真的有用吗?

时间:2013-11-05 08:49:47

标签: c# .net logging aop

我们正在尝试使用AOP在我们的应用程序中实现Logging(顺便提一下PostSharp,但这个问题与任何AOP框架有关)。

我们面临的问题是我们获得的信息如下:

  

使用参数输入方法XXX:

     
      
  • 参数内容,如果是值类型。
  •   如果完成,
  • ToString()中的任何内容都会覆盖。
  •   
  • 如果未覆盖ToString(),则为classname。
  •   

这些信息不是很有用,因为通常我们得到的是第三种情况。我们还创造了许多非有用的信息。

如果您使用AOP登录任何产品,您是如何解决此问题的?

提前致谢。

2 个答案:

答案 0 :(得分:3)

一些方法:

  • 在要记录的类型上放置一个公共接口。 (例如,ILoggable)。实现该接口将使您的方面能够准确记录您想要的内容。缺点是你必须为你可能记录的每个对象实现/维护ILoggable。

  • 使用反射(这就是我在博客上audit example中所做的。它使用的是MVC ActionFilter,但原理是相同的)。在博客文章中详细说明了权衡,但基本上使用反射和性能问题的复杂性取决于您记录的数量和频率。

  • 使用序列化。给定一个对象,将其序列化为Json或XML或其他任何东西,并记录该字符串。根据您对日志的处理,这可能从完美到无价值,并且取决于序列化的工作方式和对象的复杂程度,这也可能是性能问题。

答案 1 :(得分:0)

我致力于一种新的AOP框架,以响应现有AOP框架的缺失功能。您可以在此处找到我的开源项目:NConcern .NET AOP Framework

与其他人的不同之处在于允许您使用System.Linq.Expression开发建议,以避免基于类型的装箱/拆箱,反射和散列跳转。使用Expression为初学者开发有点困难,但对于高级开发人员来说很容易。

示例一个简单的日志记录示例(进入控制台)而不重写您的业务,反射和装箱。

一项业务:计算器

public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

您的日志记录Aspect由linq表达式实现,用于描述建议必须如何工作。

public class Logging : IAspect
{
    //this is not an advice, this method is called to produce advices
    public IEnumerable<IAdvice> Advise(MethodInfo method)
    {
        //generic presentation method
        var presentation = typeof(Presentation). GetMethod("Of");

        //example log on exception
        //instance, arguments and exception are Expressions
        yield return Advice.Linq.After.Throwing((instance, arguments, exception) =>
        {
            Expression.Call
            (
                typeof(Console).GetMethod("WriteLine",...),
                Expression.Call
                (
                    typeof(string).GetMethod("Concat", new Type[] { typeof(string[]) }),
                    Expression.NewArrayInit(typeof(string), arguments.Select(argument => argument.Type == typeof(string) ? argument : ...).ToArray())
                )
            )
        }
    }
}