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

我们试图在我们的应用程序中使用AOP(和PostSharp,但是这个问题涉及到任何AOP框架)实现Logging。

我们面临的问题是我们得到的信息如下所示:

使用参数输入方法XXX:

  • 参数内容(如果它是值类型的话)。
  • 如果已完成,则ToString()中的任何内容都将被覆盖。
  • 如果ToString()未被覆盖,则返回classname。
  • 这个信息并不是很有用,因为通常我们得到的是第三种情况。 我们也在创造非常有用的信息。

    如果您使用AOP登录任何产品,您是如何处理这个问题的?

    提前致谢。


    几种方法:

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

  • 使用反射(这是我在我的博客上的这个审计示例中所做的,它使用MVC ActionFilter,但原理相同)。 这些折衷在博客文章中有详细说明,但基本上它是使用反射和性能问题的复杂性,具体取决于您记录的数量和频率。

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


  • 我正在研究一种新的AOP框架,以对现有AOP框架的缺失功能做出回应。 你可以在这里找到我的开源项目:NConcern .NET AOP框架

    与其他人不同之处在于允许您使用System.Linq.Expression开发您的建议,以避免根据类型进行装箱/取消装箱,反射和散列跳转。 对于初学者来说,开发使用Expression是一件难事,但对于高级开发者来说很容易。

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

    一项业务:计算器

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

    由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())
                    )
                )
            }
        }
    }
    
    链接地址: http://www.djcxy.com/p/17021.html

    上一篇: AOP (aspect oriented programming) and logging. Is it really functional?

    下一篇: Center of rotated cv::Rect