【问题标题】:Query and modify log4net logger levels from code从代码中查询和修改 log4net 记录器级别
【发布时间】:2013-12-21 12:02:17
【问题描述】:

我想在我的应用程序中创建一个区域,让系统管理员直接修改记录器级别。

This answer from 2009 暗示我可以做到

foreach (ILog logger in log4net.LogManager.GetCurrentLoggers())
{
  ((log4net.Repository.Hierarchy.Logger)logger).Level = 
      log4net.Core.Level.Error;
}

我的应用程序使用log4net 2.0.3 (1.2.13),这似乎不可用,因为ILog 的任何实现都没有继承该类。

相反,我可以获取每个ILogLogger 属性以获取ILogger 的实例。这给了我名称,但不会让我查询或设置级别。虽然这是实现中可用的能力,但我不能简单地进行转换,因为实现是一个内部类。

如何在最近的版本中做到这一点?

【问题讨论】:

    标签: log4net


    【解决方案1】:

    您必须从每个logger 中获取Logger 属性并将其转换为log4net.Repository.Hierarchy.Logger

    foreach (ILog logger in log4net.LogManager.GetCurrentLoggers())
    {
        var log = logger.Logger as log4net.Repository.Hierarchy.Logger;
        Console.WriteLine("Name: {0}, Level: {1}", log.Name, log.Level);
        log.Level = log4net.Core.Level.Error;
    }
    

    【讨论】:

      【解决方案2】:

      您是对的,您必须获取每个 ILog 的 Logger 属性:然后您需要将其转换为 log4net.Repository.Hierarchy.Logger

      ILog.Logger 返回一个ILogger,正如您所见,它没有公开可写的Level 属性,我猜这被认为是内部实现细节。但是将其转换为具体的 log4net.Repository.Hierarchy.Logger 类型可以让您访问所需的内容。

      来自您链接到其答案的问题中的示例:

      foreach (log4net.ILog log in log4net.LogManager.GetCurrentLoggers())
      {
          log4net.Repository.Hierarchy.Logger logger = 
               (log4net.Repository.Hierarchy.Logger)log.Logger;
          Debug.WriteLine(
              String.Format("{0} Parent {1} Level {2} EffectiveLevel {3}<br>",
              logger.Name,
              logger.Parent.Name,
              logger.Level == null ? "<null>" : logger.Level.Name,
              logger.EffectiveLevel
              )
              );
      }
      

      【讨论】:

      • 感谢您的完整回答,这澄清了它
      猜你喜欢
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多