【问题标题】:.NET: Logging entry / exit without AOP?.NET:在没有 AOP 的情况下记录进入/退出?
【发布时间】:2013-04-05 03:15:06
【问题描述】:

我希望能够在代码执行进入方法然后退出时进行记录,我想知道是否有人有任何 cmets 以实现此目的的最佳方式?

我知道存在一种在运行时注入日志记录代码的 AOP 方式,但我希望拥有更多控制权,而且 PostSharp 似乎是一个付费框架。

您会在这里推荐什么级别的日志记录,我认为是 DEBUG。

记录时间呢?方法进入vs退出需要多长时间

我很想知道其他人在这里做什么以及您正在使用什么框架。

我正在考虑使用 log4net。

我正在考虑记录的是参数和方法的名称以及参数的值,退出时我正在考虑记录我返回的对象的值(如果返回的话)..

其他人都在做什么?

提前致谢

【问题讨论】:

    标签: c# logging log4net enterprise-library nlog


    【解决方案1】:

    如果您不想使用 PostSharp(尽管有免费版本)或生成运行时代理,则有一个名为 Afterthought 的静态编织开源替代方案。

    或者,您可以使用profiling tools 之一。 VS Ultimate 内置了一个。

    【讨论】:

    • 谢谢,但确实在寻找非 AOP 风格的日志记录...但感谢您的 cmets。
    【解决方案2】:

    好吧,您当然可以创建一个“一次性记录器”,它可以“自动”记录您选择的方法的信息:

    public class EnterExitLogger : IDisposable
    {
      Logger logger;
      string name;
    
      public EnterExitLogger(Logger logger, string name, params object [] args)
      {
        this.logger = logger;
        this.name = name;
        this.logger.Debug("Entering {0}", this.name);
        int i = 0;
        foreach (var a in args)
        {
          this.logger.Debug("arg[{0}] = {1}", i, a);
          i++;
        }
      }
    
      public void Dispose()
      {
        this.Logger.Debug("Exiting {0}", this.name);
      }
    }
    

    然后像这样使用它:

    public class MyClass
    {
      private static readonly Logger logger = LogManager.GetCurrentClassLogger();
    
      public void SomeMethod(int x, int y)
      {
        using (new EnterExitLogger(logger, "SomeMethod", x, y))
        {
          //Do your work here
        }
      }
    }
    

    我觉得这不是一个特别好的主意,我怀疑我自己会不会这样做。另一方面,它确实在不使用 AOP 的情况下实现了某种形式的 Enter/Exit 日志记录。如果您真的想要“自动”进入/退出日志记录,我不确定如何在没有 AOP 或企业库版本(其名称让我忽略了)的情况下实现它。

    显然,在我提出的解决方案中创建和处理 EnterExitLogger 会产生一些开销,但对您来说可能还不够。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 2019-04-13
      • 2016-04-05
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      相关资源
      最近更新 更多