我正在考虑使用 Postsharp 框架来减轻应用程序方法日志记录的负担。它基本上允许我用日志属性装饰方法,并在编译时将所需的日志代码注入到 il.xml 中。我喜欢这个解决方案,因为它可以将噪音排除在设计时间码环境之外。有什么想法、经验或更好的选择吗?
问问题
4567 次
3 回答
7
我使用 Castle Windsor DynamicProxies 应用 AOP 日志记录。我已经将 Castle 用于它的 IoC 容器,因此将它用于 AOP 对我来说是阻力最小的路径。如果您想了解更多信息,请告诉我,我正在整理代码以将其作为博客文章发布
编辑
好的,这是基本的拦截器代码,基本失败,但它可以满足我的一切需求。有两个拦截器,一个记录所有内容,另一个允许您定义方法名称以允许更细粒度的日志记录。此解决方案失败依赖于温莎城堡
抽象基类
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);
}
}
}
于 2008-09-18T11:08:49.163 回答
6
+1 后锐化。一直在使用几件事(包括一些尝试向 C# 代码添加前置条件和后置条件)并且不知道没有它我将如何做到......
于 2008-09-25T20:09:38.343 回答
5
这在一定程度上取决于您将开发和支持该项目多长时间。当然,IL 编织是一项不错的技术,但是如果 IL 和/或程序集元数据格式再次发生变化(就像在 1.1 和 2.0 之间所做的那样)并且这些变化使工具与新格式不兼容,会发生什么情况。
如果您依赖该工具,那么它会阻止您升级您的技术,直到该工具支持它。如果对此没有任何保证(或者甚至这种开发将继续,尽管看起来确实有可能),那么我会对在长期项目中使用它非常谨慎。
短期,不过没问题。
于 2008-09-25T20:25:07.917 回答