从代码中查询和修改log4net记录器级别

时间:2013-12-04 20:08:25

标签: log4net

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

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的实现没有继承该类。

相反,我可以为ILog的实例获取每个Logger的{​​{1}}属性。这给了我名字,但不会让我查询或设置级别。虽然这是一种可用于实现的功能,但我不能简单地进行转换,因为实现是内部类。

如何在最近的版本中执行此操作?

2 个答案:

答案 0 :(得分:1)

您必须获取每个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
        )
        );
}

答案 1 :(得分: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;
}
相关问题