有没有办法以编程方式在log4net中设置日志级别?我假设有一个属性可以让你这样做,但我似乎找不到一个.
我想要做的是有一个可配置选项进入调试模式.这会导致额外的记录.
我正在使用单独的log4net配置xml文件.目前我提出的解决方案如下:
使用dom编辑日志文件,然后调用XMLConfigurator根据文件配置日志文件.
有两个日志配置文件,并在选项更改调用xml Configurator上使用相应的日志配置文件.
我倾向于2,有什么理由不行吗?
我正在寻找有关在我的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服务应用程序的管理页面上!