【问题标题】:ASP.net Custom Errors LogginASP.net 自定义错误日志
【发布时间】:2011-05-01 11:43:51
【问题描述】:

我正在使用 web.config 文件的 customErrors 属性来显示自定义错误页面:

<customErrors mode="On" defaultRedirect="/errorpage.aspx">
    <error statusCode="404" redirect="/404Page.aspx"/>
    <error statusCode="403" redirect="/403page.aspx"/>
</customErrors>

没什么太花哨的。现在我要做的是记录加载任何这些页面时发生的错误。我对任何异常都特别感兴趣,我真的不在乎用户在收到 404 时在哪个页面上。

我想捕获异常并将其记录到数据库表中。会不会有这样的工作:

//errorpage.aspx
public void Page_Load(object sender,EventArgs e)
{
    Exception objErr = Server.GetLastError().GetBaseException();
    var err = new {Url = Request.Url.ToString(),
                   Message = objErr.Message,
                   Trace = objErr.StackTrace.ToString()};

    db.Errors.InsertOnSubmit(err);
    db.SubmitChanges();

    Server.ClearError();
}

是否还有其他信息值得捕获,或者通常在错误时捕获?

【问题讨论】:

    标签: c# asp.net error-logging


    【解决方案1】:

    您是否考虑过使用 Elmah 之类的东西,而不是自己动手,它可以为您处理这一切:

    http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx

    【讨论】:

    • Elmah 看起来很整洁,但在这一点上,我基本上只对 a 解决方案感兴趣,直到我有时间获得 正确 解决方案。
    【解决方案2】:

    我认为有更好的方法来做到这一点:

    1. 使用ELMAH!
    2. 在 Global.asax Application_Error 事件中运行您的代码。

    void Application_Error(object sender, EventArgs e)
    {
       Exception ex = Server.GetLastError().GetBaseException();
       EventLog.WriteEntry("Test Web",
         "MESSAGE: " + ex.Message + 
         "\nSOURCE: " + ex.Source +
         "\nFORM: " + Request.Form.ToString() + 
         "\nQUERYSTRING: " + Request.QueryString.ToString() +
         "\nTARGETSITE: " + ex.TargetSite +
         "\nSTACKTRACE: " + ex.StackTrace, 
         EventLogEntryType.Error);
    }
    

    【讨论】:

      【解决方案3】:

      您为什么不简单地使用应用程序服务器日志,如果错误/异常是由于无法访问数据库而发生的。以下是我在某些网站上记录错误的方式:

      public static void WriteException(Exception exception)
      {
          EventLog eventLog = null;
          try
          {
              StringBuilder message = new StringBuilder();
              message.Append("[").Append(exception.Source).Append(" - ").Append(exception.GetType().FullName);
              message.Append("]").Append(@"\r\n").Append(exception.ToString());              
      
              eventLog = new EventLog();
              eventLog.Log = "LOG_FILE_NAME";
              eventLog.Source = "APP_IDENTIFIER";
              eventLog.WriteEntry(message.ToString(), EventLogEntryType.Warning);
          }
          catch (Exception ex) {/*DO-NOTHING*/ string msg = ex.Message; }
          finally { if (eventLog != null) { eventLog.Dispose(); } eventLog = null; }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-16
        • 2011-08-11
        相关资源
        最近更新 更多