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

从代码查询和修改log4net记录器级别,log4net,Log4net,我想在我的应用程序中创建一个区域,让系统管理员直接修改记录器级别 意味着我可以用 foreach (ILog logger in log4net.LogManager.GetCurrentLoggers()) { ((log4net.Repository.Hierarchy.Logger)logger).Level = log4net.Core.Level.Error; } 我的应用程序使用,这似乎不可用,因为没有ILog的实现继承该类 相反,我可以为iloger的实例获取每

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

意味着我可以用

foreach (ILog logger in log4net.LogManager.GetCurrentLoggers())
{
  ((log4net.Repository.Hierarchy.Logger)logger).Level = 
      log4net.Core.Level.Error;
}
我的应用程序使用,这似乎不可用,因为没有
ILog
的实现继承该类

相反,我可以为
iloger
的实例获取每个
iloger
Logger
属性。这将为我提供名称,但不允许我查询或设置级别。虽然这是一种在实现上可用的功能,但我不能简单地执行强制转换,因为实现是一个内部类


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

您是对的,您必须获得每个
ILog
的记录器属性:然后您需要将其强制转换到
log4net.Repository.Hierarchy.Logger

ILog.Logger
返回一个
ILogger
,正如您所看到的,它没有公开可写的
级别
属性,我想这是一个内部实现细节。但是,将其转换为具体的
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
        )
        );
}
foreach(log4net.LogManager.GetCurrentLoggers()中的log4net.ILog日志)
{
log4net.Repository.Hierarchy.Logger记录器=
(log4net.Repository.Hierarchy.Logger)log.Logger;
Debug.WriteLine(
String.Format(“{0}父级{1}级{2}有效级{3}
”, logger.Name, logger.Parent.Name, logger.Level==null?“:logger.Level.Name, logger.EffectiveLevel ) ); }
您必须从每个
记录器
中获取
记录器
属性,并将其转换为
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;
}

谢谢你的完整答案,这澄清了它