C# 如何使用log4net在日志记录链中隐藏方法?

C# 如何使用log4net在日志记录链中隐藏方法?,c#,.net,visual-studio,attributes,log4net,C#,.net,Visual Studio,Attributes,Log4net,假设我有ILog的扩展。当前,当我在业务逻辑中使用ILog扩展时,我将%method%location%class属性视为扩展类属性。我想让萨姆成为我商业逻辑的参考。log4net属性中是否有隐藏ILog扩展的功能 比如说 using log4net; namespace Helpers { public class MyObject {} public static class LoggerExtensions { public static void Deb

假设我有ILog的扩展。当前,当我在业务逻辑中使用ILog扩展时,我将
%method%location%class
属性视为扩展类属性。我想让萨姆成为我商业逻辑的参考。log4net属性中是否有隐藏ILog扩展的功能

比如说

using log4net;

namespace Helpers {
    public class MyObject {}
    public static class LoggerExtensions {
        public static void Debug(this ILog log, MyObject obj, string format, params object[] arguments) {
            log.DebugFormat(format, arguments);
        }
    }
}
为此,
将返回类似以下内容:
LoggerExtensions调试消息
,而log4net将不关心从何处调用它


我需要一些属性使这个扩展对log4net stackTrace检查器透明。有没有或者如何创建一个呢?

你应该可以做类似的事情(注意,我现在没有时间来测试这个)

记录正确的调用站点(即调用扩展方法的位置,而不是扩展方法本身)的关键是使用“Log”方法,将实现日志扩展的对象类型传递给它。Log4net将遍历堆栈,直到到达与传递给Log的类型相同的类型。有些人将此类型称为边界类型。堆栈上的下一个条目将是“真实”代码中的实际调用站点,而不是日志代码

还要注意,我检查调试日志记录是否已启用,如果未启用,则提前返回。Log方法没有采用format和params参数的签名,因此在调用Log之前必须对消息进行格式化。我们不想花钱格式化消息,除非它真的被记录下来

正如我前面所说的,我还没有测试过这一点,但是在包装log4net记录器(例如在Common.Logging.Net中)时使用了这一技术,以确保维护调用站点。如果您在这里查找lot4net包装(或NLog包装),那么绝大多数都不是为了维护调用站点而编写的,所以要小心。如果要在扩展方法后面包装或隐藏log4net,则不能简单地委托给Debug、Info等方法。必须使用Log方法才能传递边界类型


祝你好运

你能展示你的扩展代码吗?
using log4net;

namespace Helpers 
{
  public class MyObject {}
  public static class LoggerExtensions 
  {
    public static void Debug(this ILog log, MyObject obj, string format, params object[] arguments) 
    {
      if (!log.IsDebugEnabled) return;

      log.Logger.Log(typeof(LoggerExtensions), LogLevel.Debug, string.Format(format, arguments));
    }
  }
}