我可以将 Global.asax 的静态属性用作 log4net 记录器吗?

本文关键字:log4net 记录器 属性 Global asax 静态 我可以 | 更新日期: 2023-09-27 18:35:46

我想做这样的事情:

<script RunAt="server">
private static log4net.ILog _logger = null;
public static log4net.ILog Logger
{ get { return _logger; } }
protected void Application_Start(object sender, EventArgs e)
{
    // Code that runs on application startup
    log4net.Config.XmlConfigurator.Configure();
    _logger = log4net.LogManager.GetLogger("DtWebLogger");
}
....
</script>

我想知道在此之后我可以在每个页面中使用相同的记录器对象。

那么,这可能吗?或者在哪里可以即时创建记录器的全局实例?

我可以将 Global.asax 的静态属性用作 log4net 记录器吗?

您不想要 Logger 的全局实例。相反,您希望每个类一个。要记录的每个类都应该有这样的内容:

private static readonly log4net.ILog _logger = log4net.LogManager.GetLogger(typeof(MyClass));

类型信息用作记录器输出的一部分。您还可以创建自己的类来包装 ILog,并为您提供一个构造函数,该构造函数从 StackFrame 中提取当前类的类型。

你的发起是正确的,log4net。LogManager.GetLogger已经使用了一个实例,无需再次执行。

您可以将其声明为属性并像这样使用:

private static readonly log4net.ILog Log = log4net.LogManager     
.GetLogger(.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

如前所述,您不需要全局记录器。在嵌套作用域上声明。