[asp.net]企业库日志记录应用程序块-到当前页面︰ 惰性写入器已设置

发布时间: 2017/3/26 5:39:36
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我尝试使用日志记录异常处理程序从企业库,但在某次当我刷新页面 (很明显),我会出现此错误︰

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

我在想也许我应该检查惰性写入器是否已经设置?

我是新来企业库日志记录应用程序块和不知道如何解决这个问题,有没有人有任何想法吗?

解决方法 1:

你只需要一次 — — 引导块,一旦惰性写入器设置它是内部存储,用于随后的 write () 调用。通常你会这样在应用程序启动时 (例如在 global.asax Application_Start)。

protected void Application_Start()
{
    Logger.SetLogWriter(new LogWriterFactory().Create());
}

上面的代码加载的配置和设置惰性写入器。现在,在您的页面,您可以调用 Logger.Write()。

顺便 SetLogWriter 并接受一个布尔值,该值指示是否引发惰性写入器已设置使您可以重写此抛出行为。

然而,你的情况你不想做,在 Page_Load。它可能会避免你所看到的错误,但在多线程环境中 (像一个 web 应用程序) 你 (可能) 会看到其他奇怪的行为,因为 SetLogWriter 将重置内部配置,你可能有文件锁定的问题或其他问题,因为处置惰性写入器。

资料来源︰ entlib 论坛

赞助商