我想在我的应用程序中创建一个区域,让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}}属性。这给了我名字,但不会让我查询或设置级别。虽然这是一种可用于实现的功能,但我不能简单地进行转换,因为实现是内部类。
如何在最近的版本中执行此操作?
答案 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;
}