Joe*_*Joe 15 .net configuration log4net
我正在寻找有关在我的ASP.NET应用程序中动态重新配置Log4Net日志记录级别的最佳方法的提示.我通常使用简单配置,其中根记录器定义默认日志记录级别,例如
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="..." />
<appender-ref ref="..." />
... etc ...
</root>
... etc
Run Code Online (Sandbox Code Playgroud)
并且可能有几个appender,每个appender都有过滤器来定义他们使用的日志记录级别.
我希望能够做的第一件事是允许管理员连接到一个管理页面,使他们能够(a)查看根记录器的当前级别,以及(b)动态更改它.我不想使用"ConfigureAndWatch"并写入磁盘上的配置文件,因为我不希望在应用程序被回收时这些更改仍然存在.
接下来我想更进一步,在Admin页面上能够显示一个TreeView,其中包含应用程序中存在的所有当前Logger及其当前日志记录级别.并允许管理员能够在层次结构的任何级别有选择地更改日志记录级别.
我的想法是创建一个通用管理页面,我可以将其放入我的所有应用程序中,使管理员能够动态选择性地启用DEBUG级别的日志记录以进行故障排除.
我发现Log4Net API有点令人困惑,任何人都可以指向样本或显示实现此目的的最佳方法.
更新:
两个答案都同样好,所以我接受了第一个 - 谢谢.为了重新开始,我可以获得所有当前的记录器,如下所示:
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
)
);
}
Run Code Online (Sandbox Code Playgroud)
EffectiveLevel是有效级别 - 如果后者不为null,则与Level相同,否则从父级继承.
上面返回的至少一个记录器将根记录器作为父记录器,这使我能够获得对根记录器的引用.
通过上述内容,应该可以重建记录器层次结构.
更新2
再次感谢.我已经实现了一个ASP.NET服务器控件,它在带有复选框的TreeView中显示记录器层次结构,并允许用户动态更改层次结构中任何节点的日志记录级别.效果很好,我将把它放在所有ASP.NET Web和Web服务应用程序的管理页面上!
你在找这样的东西(未经测试的代码):
foreach (ILog logger in log4net.LogManager.GetCurrentLoggers())
{
((log4net.Repository.Hierarchy.Logger)logger).Level =
log4net.Core.Level.Error;
}
Run Code Online (Sandbox Code Playgroud)
您显然可以以相同的方式提取记录器名称等.
我已经成功地以编程方式更改了 log4net 记录器的日志记录级别,但是如何从公共 API 执行此操作并不明显。鉴于此记录器:
private readonly log4net.ILog mylogger;
Run Code Online (Sandbox Code Playgroud)
您必须执行以下花哨的操作才能将其设置为 Debug:
((log4net.Repository.Hierarchy.Logger)mylogger.Logger).Level =
log4net.Core.Level.Debug;
Run Code Online (Sandbox Code Playgroud)
在某些情况下——我不知道是什么导致了这个更复杂的要求——您可能需要按照文章log4net 中显示的额外步骤并更改记录器级别。