【问题标题】:using C# Custom Attributes for exception and audit trail logging使用 C# 自定义属性进行异常和审计跟踪日志记录
【发布时间】:2010-12-23 07:45:37
【问题描述】:

是否可以创建一个自定义功能来捕获由自定义属性设置的方法中发生的异常?

我打算做这样的事情:

[Logging(FeatureEnum.SomeFeature, IntentEnum.SomeIntent, "some comment")]
public void SomeMethodThatDoesATask()
{
    try
    {
      var doSomeAction = new LazyProcess();
      doSomeAction.WhoDunnit();
    }
    catch(Exception ex)
    {
       StaticMethodThatDoesLogging.CatchError(ex);
    }
}

问题是: 如何捕获放置此属性的方法名称以及引发了什么事件?它可以捕获异常,也可以自动记录调用了此方法。

【问题讨论】:

  • 你知道 PostSharp 库吗? sharpcrafters.com/postsharp(不再免费)。
  • 你好 Uwe,我自己制作的原因。
  • 只是我的看法,但社区版(免费,排序)对于大多数用途来说已经足够了。我读到有一些严重的巫术使 PostSharp 工作,我宁愿让他们处理它。否则,祝你好运!

标签: c# logging custom-attributes


【解决方案1】:

这是不容易实现的。例如,TypeMock 使用 .NET 框架分析器 API 来监视应用程序的执行。它允许您注册不同的事件,并在调用方法、发生异常时收到通知……但这并不是一件容易的事。

另一方面,您可以使用 AOP,但它需要您修改代码,以便调用者使用一些生成的代理而不是真正的类。 Spring.NET 有一些不错的功能。

所以基本上不使用 .NET 框架 Profiler API 或不编写一些自定义代码来使用反射从给定类中读取这些属性,您无法实现这一点。属性只是类元数据,没有可以理解它们的东西,它们什么都不做。

【讨论】:

  • 我同意 - 最好使用库而不是汇总自己的实现。
【解决方案2】:

属性只是元数据。您需要使用 PostSharp 之类的东西进行代码编织,或者使用 Castle.DynamicProxy 之类的运行时拦截库。属性本身不包含应用程序的实际功能,除非通过反射。

如果您在进行日志记录的方法中有一行代码,您可以获取调用方法的堆栈帧,使用反射检查属性,然后从那里开始。我假设这就是你想用 StaticMethodThatDoesLogging 做的事情。

public void CatchError(Exception ex)
{
    StackFrame parentFrame = new StackFrame(1);
    MethodBase mi = parentFrame.GetMethod();
    LoggingAttribute attr = mi.GetCustomAttributes(typeof(LoggingAttribute), true).FirstOrDefault() as LoggingAttribute;

    if (attr != null)
    {
       // do your logging.
    }
}

【讨论】:

  • 希望这可以编译。我没有方便的 Visual Studio 自己尝试一下。我最近做了很多这样的事情,所以我正在记忆中工作。
【解决方案3】:
猜你喜欢
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 2022-12-21
  • 2015-09-23
  • 2013-10-25
  • 1970-01-01
相关资源
最近更新 更多