我正在寻求有关在我的ASP.NET应用程序中动态重新配置Log4Net日志级别的最佳方法的建议。通常我使用简单的配置方式,其中根记录器定义默认的日志级别,例如:
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="..." />
<appender-ref ref="..." />
... etc ...
</root>
... etc
并且可能有多个appender,每个appender都有过滤器来定义它们使用的日志级别。
首先,我想做的是允许管理员连接到管理页面,使他们能够(a)查看根记录器的当前级别和(b)动态更改它。我不想使用“ConfigureAndWatch”并写入磁盘上的配置文件,因为我不希望这些更改在应用程序重新启动时保留。
接下来,我想进一步,在管理页面上能够显示所有当前存在于应用程序中的Logger的TreeView以及它们当前的日志级别,并允许管理员在层次结构的任何级别上选择性地更改日志记录级别。
这个想法是创建一个通用的管理员页面,可以将其放入所有我的应用程序中,以便管理员可以动态地选择启用DEBUG级别的日志记录以进行故障排除。
我发现Log4Net API有点令人困惑,有人可以指向示例或展示实现此目的的最佳方式吗。
更新:
两个答案都同样好,所以我接受了第一个答案-谢谢。回顾一下,我可以按如下方式获取所有当前的loggers:
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
)
);
}
EffectiveLevel是有效级别 - 如果Level不为空,则与Level相同,否则从父级继承。
上面返回的日志记录器中至少有一个将具有根记录器作为父级,这使我能够获得对根记录器的引用。
有了上述内容,应该可以重建记录器层次结构。
更新2
再次感谢。我已经实现了一个ASP.NET服务器控件,在TreeView中显示记录器层次结构并带有复选框,允许用户动态更改层次结构中任何节点的日志记录级别。工作得很好,我将在所有我的ASP.NET Web和Web服务应用程序的管理页面上放置它!
logger.Logger
才能使转换起作用。 - James Barrass