代码之家  ›  专栏  ›  技术社区  ›  redsquare

后竖琴-纺织-思想

  •  10
  • redsquare  · 技术社区  · 16 年前

    我正在考虑使用Postharp框架来减轻应用程序方法日志记录的负担。 它基本上允许我用logging属性修饰方法,并在编译时将所需的日志代码注入到IL中。我喜欢这个解决方案,因为它可以将噪音排除在设计时代码环境之外。 有什么想法、经验或更好的选择吗?

    4 回复  |  直到 16 年前
        1
  •  7
  •   Chris Canal    16 年前

    我使用Castle Windsor DynamicProxies使用AOP进行日志记录。我已经在使用Castle作为IOC容器,所以使用它作为AOP对我来说是阻力最小的途径。如果你想了解更多信息,请告诉我,我正在整理代码,以便将其作为博客文章发布。

    编辑

    好的,这里是基本的拦截程序代码,faily-basic,但它可以满足我的所有需要。有两个拦截器,一个是Everyhing日志,另一个允许您定义方法名以允许更细粒度的日志记录。这个解决方案失败取决于温莎城堡。

    抽象基类

    namespace Tools.CastleWindsor.Interceptors
    {
    using System;
    using System.Text;
    using Castle.Core.Interceptor;
    using Castle.Core.Logging;
    
    public abstract class AbstractLoggingInterceptor : IInterceptor
    {
        protected readonly ILoggerFactory logFactory;
    
        protected AbstractLoggingInterceptor(ILoggerFactory logFactory)
        {
            this.logFactory = logFactory;
        }
    
        public virtual void Intercept(IInvocation invocation)
        {
            ILogger logger = logFactory.Create(invocation.TargetType);
    
            try
            {
                StringBuilder sb = null;
    
                if (logger.IsDebugEnabled)
                {
                    sb = new StringBuilder(invocation.TargetType.FullName).AppendFormat(".{0}(", invocation.Method);
    
                    for (int i = 0; i < invocation.Arguments.Length; i++)
                    {
                        if (i > 0)
                            sb.Append(", ");
    
                        sb.Append(invocation.Arguments[i]);
                    }
    
                    sb.Append(")");
    
                    logger.Debug(sb.ToString());
                }
    
                invocation.Proceed();
    
                if (logger.IsDebugEnabled && invocation.ReturnValue != null)
                {
                    logger.Debug("Result of " + sb + " is: " + invocation.ReturnValue);
                }
            }
            catch (Exception e)
            {
                logger.Error(string.Empty, e);
                throw;
            }
        }
    }
    }
    

    完全日志记录实施

    namespace Tools.CastleWindsor.Interceptors
    {
    using Castle.Core.Logging;
    
    public class LoggingInterceptor : AbstractLoggingInterceptor
    {
        public LoggingInterceptor(ILoggerFactory logFactory) : base(logFactory)
        {
        }
    }
    }
    

    方法测井

    namespace Tools.CastleWindsor.Interceptors
    {
    using Castle.Core.Interceptor;
    using Castle.Core.Logging;
    using System.Linq;
    
    public class MethodLoggingInterceptor : AbstractLoggingInterceptor
    {
        private readonly string[] methodNames;
    
        public MethodLoggingInterceptor(string[] methodNames, ILoggerFactory logFactory) : base(logFactory)
        {
            this.methodNames = methodNames;
        }
    
        public override void Intercept(IInvocation invocation)
        {
            if ( methodNames.Contains(invocation.Method.Name) )
                base.Intercept(invocation);
        }
    }
    }
    
        2
  •  6
  •   Luis Abreu    16 年前

    +1个在竖琴上。已经用了好几样东西(包括一些在C代码中添加前置条件和后置条件的尝试),不知道没有它我会怎么做…

        3
  •  5
  •   Greg Beech    16 年前

    这在某种程度上取决于您将开发和支持该项目的时间。当然,IL编织是一种很好的技术,但是如果IL和/或程序集元数据格式再次发生更改(如在1.1和2.0之间所做的更改),并且这些更改使工具与新格式不兼容,会发生什么情况呢?

    如果您依赖该工具,那么它会阻止您升级您的技术,直到该工具支持它。如果没有对这一点的保证(或者即使开发将继续进行,尽管看起来很有可能),那么对于在长期项目中使用它,我会非常谨慎。

    短期内,没问题。

        4
  •  3
  •   Joel Lucsy    16 年前

    用它来做这个。工作很棒!我强烈推荐!