从代码查询和修改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;
}
谢谢你的完整答案,这澄清了它