【问题标题】:ASP.net logging errors that occur on different pages不同页面上发生的 ASP.net 日志记录错误
【发布时间】:2011-09-23 10:51:52
【问题描述】:

我该怎么做呢?

protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            doSomething();
        }
        catch (Exception ex)
        {
            // Here i would like to know that the page is "Problem.aspx"
            // and that it was caused from the doSomething() function
        }
    }

    private void doSomething()
    {
        logToSomething();
    }

【问题讨论】:

    标签: c# asp.net exception logging


    【解决方案1】:

    Exception 对象有一个stack trace 属性,它可以准确地告诉您错误发生的位置。

    另外,请查看Microsoft Enterprise Library(更具体地说是日志记录块)。

    记录的错误提供堆栈跟踪等信息,让您准确了解错误发生的位置。

    【讨论】:

    • Elmah 可从 nuget 获得,是上述库的一部分,在错误处理方面非常出色。
    【解决方案2】:

    我正在使用这个小类来记录错误,看看我如何获取页面和函数(Stacktrace):

    public static class ErrorLog
    {
        public static void WriteError(Exception ex)
        {
            try {
                string path = "~/error/logs/" + System.DateTime.Now.ToString("dd-MM-yyyy") + ".txt";
                if ((!System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath(path)))) {
                    System.IO.File.Create(System.Web.HttpContext.Current.Server.MapPath(path)).Close();
                }
                using (System.IO.StreamWriter w = System.IO.File.AppendText(System.Web.HttpContext.Current.Server.MapPath(path))) {
                    w.WriteLine(System.Environment.NewLine + "Log Entry : {0}", System.DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantCulture));
                    var page = VirtualPathUtility.GetFileName(HttpContext.Current.Request.Url.AbsolutePath);
                    w.WriteLine("Error in: " +  page);
                    string message = "Message: " + ex.Message;
                    w.WriteLine(message);
                    string stack = "StackTrace: " + ex.StackTrace;
                    w.WriteLine(stack);
                    w.WriteLine("__________________________");
                    w.Flush();
                    w.Close();
                }
            } catch (Exception writeLogException) {
                try {
                    WriteError(writeLogException);
                } catch (Exception innerEx) {
                    //ignore
                }
            }
        }
    }
    

    对我来说完全够用了。

    注意:从 VB.NET 转换而来,因此未经测试

    【讨论】:

    • 这么多不必要的代码,当您可以设置 Enterprise Library Logging 块时,这一切都为您完成了。
    【解决方案3】:

    您可以通过解析异常消息来确定所有这些。

    查看您的消息并使用正则表达式提取您需要的信息。

    【讨论】:

      【解决方案4】:

      您可能想要研究的另一个选项是 ELMAH(用于 ASP.NET 的错误日志记录模块和处理程序)http://code.google.com/p/elmah/。我想这真的取决于您的具体需求。

      【讨论】:

        【解决方案5】:

        使用log4net,记录错误消息。如需帮助,请查看这些 article 1article 2

        【讨论】:

          【解决方案6】:

          无论你使用什么记录方法,都要做这样的事情。(手动输入可能无法编译)

          try
          {
            DoignStuff();
          }
          catch( Exception ex)
          {
          Trace.WriteLine( "Exception in <Page Name>  while calling DoingStuff() Ex:"+ ex.ToString() );
          }
          

          它将以页面名称和方法开头(这是多余的,但让生活更轻松) 然后它将 EX 转换为显示调用堆栈和各种其他好东西的字符串,并将其放入日志文件中

          注意:您必须在 &lt;Page Name&gt; 的位置输入页面名称。

          Log4Net 和 Elmah 也非常适合让生活更轻松。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-10-30
            • 1970-01-01
            • 2011-06-03
            • 2014-03-05
            • 2019-02-20
            • 1970-01-01
            • 2010-10-24
            • 2020-03-14
            相关资源
            最近更新 更多