企业库日志记录应用程序块 - System.InvalidOperationException:LogWriter 已设置
The Enterprise Library Logging Application Block - System.InvalidOperationException: The LogWriter is already set
我正在尝试使用企业库中的日志记录异常处理程序,但偶尔刷新页面时(显然),我会收到此错误:
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidOperationException: The LogWriter is already set.
代码
protected void Page_Load(object sender, EventArgs e)
{
Logger.SetLogWriter(new LogWriterFactory().Create());
LogEntry entry = new LogEntry();
entry.Message = "I am logging";
Logger.Write(entry);
if (!Page.IsPostBack)
{
}
}
堆栈跟踪
[InvalidOperationException: The LogWriter is already set.]
Microsoft.Practices.EnterpriseLibrary.Logging.Logger.SetLogWriter(LogWriter logWriter, Boolean throwIfSet) +165
ASPUserManager.Presentation.AspNetUI.GridView.Page_Load(Object sender, EventArgs e) in \AspNetUI\GridView.aspx.cs:20
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
System.Web.UI.Control.OnLoad(EventArgs e) +92
System.Web.UI.Control.LoadRecursive() +54
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772
我在想也许我应该检查一下 LogWriter 是否已经设置?
我是企业库日志记录应用程序块的新手,我不确定如何解决这个问题,有人知道吗?
您只需要 bootstrap 块一次——一旦设置了 LogWriter,它就会存储在内部并用于后续的 Write() 调用。通常您会在应用程序启动时执行此操作(例如 global.asax Application_Start)。
protected void Application_Start()
{
Logger.SetLogWriter(new LogWriterFactory().Create());
}
以上代码加载配置并设置 LogWriter。现在在您的页面中您可以调用 Logger.Write()。
顺便说一句,SetLogWriter 确实接受一个布尔值,指示是否在 LogWriter 已设置的情况下抛出,因此您可以覆盖此抛出行为。
但是,在您的情况下,您不想在 Page_Load 中这样做。它可能会避免您看到的错误,但在多线程环境(如 Web 应用程序)中,您会(可能)看到其他奇怪的行为,因为 SetLogWriter 会重置内部配置,并且您可能会遇到文件锁定问题或其他问题已处置的 LogWriter。
您需要将logwritter设置为false
Logger.SetLogWriter(logWriterFactory.Create(),假);
默认情况下,throwIfSet 设置为 true 并在已设置 logwriter 时抛出错误。
我正在尝试使用企业库中的日志记录异常处理程序,但偶尔刷新页面时(显然),我会收到此错误:
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidOperationException: The LogWriter is already set.
代码
protected void Page_Load(object sender, EventArgs e)
{
Logger.SetLogWriter(new LogWriterFactory().Create());
LogEntry entry = new LogEntry();
entry.Message = "I am logging";
Logger.Write(entry);
if (!Page.IsPostBack)
{
}
}
堆栈跟踪
[InvalidOperationException: The LogWriter is already set.]
Microsoft.Practices.EnterpriseLibrary.Logging.Logger.SetLogWriter(LogWriter logWriter, Boolean throwIfSet) +165
ASPUserManager.Presentation.AspNetUI.GridView.Page_Load(Object sender, EventArgs e) in \AspNetUI\GridView.aspx.cs:20
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
System.Web.UI.Control.OnLoad(EventArgs e) +92
System.Web.UI.Control.LoadRecursive() +54
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772
我在想也许我应该检查一下 LogWriter 是否已经设置?
我是企业库日志记录应用程序块的新手,我不确定如何解决这个问题,有人知道吗?
您只需要 bootstrap 块一次——一旦设置了 LogWriter,它就会存储在内部并用于后续的 Write() 调用。通常您会在应用程序启动时执行此操作(例如 global.asax Application_Start)。
protected void Application_Start()
{
Logger.SetLogWriter(new LogWriterFactory().Create());
}
以上代码加载配置并设置 LogWriter。现在在您的页面中您可以调用 Logger.Write()。
顺便说一句,SetLogWriter 确实接受一个布尔值,指示是否在 LogWriter 已设置的情况下抛出,因此您可以覆盖此抛出行为。
但是,在您的情况下,您不想在 Page_Load 中这样做。它可能会避免您看到的错误,但在多线程环境(如 Web 应用程序)中,您会(可能)看到其他奇怪的行为,因为 SetLogWriter 会重置内部配置,并且您可能会遇到文件锁定问题或其他问题已处置的 LogWriter。
您需要将logwritter设置为false Logger.SetLogWriter(logWriterFactory.Create(),假);
默认情况下,throwIfSet 设置为 true 并在已设置 logwriter 时抛出错误。