【问题标题】:Need Review Comments for my Error Logging Mechanism需要我的错误记录机制的评论评论
【发布时间】:2009-03-31 04:39:24
【问题描述】:

在生产/QA/Dev 的每一次中断中,找出异常的根源是非常关键且耗时的过程。

由于Web应用程序处于多用户环境和无状态\异步(HTTP)中,查看Eventviewer / log文件和最终用户报告的问题的根本原因确实是一项艰巨的工作;此外,它还取决于最终用户对问题进行详细解释的程度。

我想出了一种创造性的方式来记录异常。哪一项让最终用户和开发团队的工作更轻松?

我们将按照签名将异常记录到 XML 文件中,并且可以远程处理以查看或报告异常

Error logging类中Static方法的签名如下

WriteLog(唯一编号、模块名称、优先级、层、字符串自定义消息、堆栈跟踪异常);

我知道有许多可重用的异常处理库,但我看到的是一个唯一编号,用于跟踪应该显示给最终用户的问题

回复用户:

如果期望处理和消耗异常,则开发人员应向最终用户显示有效的用户友好消息。如果向应用程序层(全局 .asax)抛出任何意外或异常,则响应将被清除,并且 HTML 中的自定义消息将被写回具有唯一 ID 的用户,如下所示

“ 发生意外错误,已记录异常以供进一步操作;请使用#生成的唯一编号与支持团队沟通“

参数详情:

唯一编号:这是为每个异常生成的唯一编号,ErrorLogging 类中的只读(获取)属性,每个异常都是唯一的,这将是 Hour+Minutes+Seconds+Milliseconds 的串联;最初我想使用 GUID,但最终用户很难记住 GUID 来报告问题。

公共字符串 strExceptionID {

      Get { 

      return  DateTime.Now.ToString(“HHmmssfff”);

          }    

     }

模块名称:这将是一个带有模块名称的静态枚举变量 前任 : 枚举模块名称 {

    Module1, 

    Module2, 

    Module3  };

优先级:这将是一个具有 Priority 的静态枚举变量,开发人员必须确定优先级,例如它是否是 Date 或整数格式的验证失败使用“Low”,或者如果它在业务层调用中出现意外则使用“2” .

我认为,如果与 SAP 或 Ariba 的接口出现故障,则应仅在 DAL 或业务逻辑层等中使用 Priority High。 例如:枚举优先级 {

        High =1, 
      Medium =2, 
      Low =3, };

层:

这将是一个带有层的静态枚举变量 例如:枚举层 {

      Presentation, 
      Business, 
      DataAccess 
            };

字符串自定义消息:

这是可选参数,由开发人员提供信息以帮助解释原因或可以传递空字符串。

带有堆栈跟踪的异常:这将是在方法内部进一步处理的异常对象。

错误日志方法内部完成的处理:

该方法还将获取登录的用户 ID 和时间戳并将其写入 XML 文件。

优点:

-> XML Logging 将使我们能够以任何方式处理使用它 -> 可以在浏览器中远程查看异常。 -> 易于追踪和发现任何异常。 -> 我们可以根据 Module, Priority , Time Stamp , UserID...等搜索、排序异常 -> 我们可以生成报告@ Module level , Layer wise , Priority , Time...

缺点: 对 XML 文件的依赖,如果它丢失了所有的异常就会被折腾,我们可以通过两种方式克服这个问题;及时将 xml 写入数据库,或者将其写入事件查看器日志记录之上,因为我们将始终拥有备份。

根据评论 cmets,我将发布 XML Schema 和 ASPX 页面以查看和搜索错误。

请花点时间查看并提供反馈。

【问题讨论】:

    标签: logging exception-handling


    【解决方案1】:

    我有点担心人们重写跟踪 API 却没有真正了解平台会为他们提供开箱即用的功能。那么让我们看看你的 API 调用:

    WriteLog(唯一编号、模块名称、优先级、层、字符串自定义消息、带有堆栈跟踪的异常);

    唯一编号: 实现一个 TraceListener(查看 System.Diagnostics),它添加了这个唯一的数字,不要让调用代码生成它。

    模块名称: 堆栈跟踪将提供这种详细信息 - 假设您知道什么代码在哪个模块中。事实上,从故障查找的角度来看,这可能并不重要。

    优先级: System.Diagnostics API 提供以下严重级别。信息、警告和错误(以及调试)。现在优先级在旁观者的眼中,从发展的角度来看 - 它要么是“嘿,这件事发生了,你可能想知道(信息)”,他“这看起来有点可疑,我们无论如何都可以继续(警告) " 和 "哎呀,我坏了(错误)"。

    层: 模块和错误之间的真正区别是什么?再一次,如果您正确使用 System.Diagnostics,则可以动态添加环境信息,例如发生这种情况的计算机。您不会希望开发人员始终如一地做到这一点。

    自定义消息: 是的 - 这是合理的。对于奖励积分,使其采用格式字符串(实际上 - Trace.TraceError/TraceWarning/TraceInformation 已经这样做了。所以就使用它。

    例外: 如果您使用 Trace.TraceError (et.al) 那么您可以使用格式字符串。并非每个错误都有异常,因此您不一定需要生成一个接受它们的 API,只要它们采用格式字符串 - 您可以这样做:

    Trace.TraceError( "用户提供了以下输入 '{0}'。以下异常是:\r\n{1}", 用户输入, 前任 );

    无论如何 - 我想我的意思是,如果你是在 .NET 中编写它,就像它看起来一样 - 花半天时间浏览 System.Diagnostics 文档。您可能不需要编写 API。

    【讨论】:

      【解决方案2】:

      我有两句话:

      1. 我不喜欢依赖时间戳作为唯一标识符。如果您确定您的网站不会被加载,那没关系,但在压力很大的情况下,毫秒级的分辨率可能还不够。原因是毫秒计数器的粒度可能大于一。这意味着两个非常接近的调用可能会获得相同的时间戳。不太可能,但为什么要限制自己?

      2. 向用户提供代码以及人类可读的消息是很好的,但您永远不应期望用户与您联系并指出错误。如果您正在寻找有关错误的反馈,只需让记录器在发生错误时向您发送一封电子邮件(这意味着您将能够使用真正的唯一标识符,例如 GUID,而不是时间戳)。

      【讨论】:

        【解决方案3】:

        对于 ExceptionID,您实际上可能最好使用 GUID。日期格式不会是唯一的,因为它每天都会滚动,而且您可能会在同一毫秒内收到多个错误。

        【讨论】:

          【解决方案4】:

          强调之前评论者的观点:如果出现由竞争条件导致的故障,您可能会在同一毫秒内获得多个异常。

          【讨论】:

            【解决方案5】:

            如果这是一个 ASP.NET 应用程序,那么您应该查看ASP.NET Health Monitoring。即使在默认情况下,它也会在事件日志中发出详细的跟踪信息。您可以将其配置为在 XML 文件中产生相同的输出,并添加您自己的跟踪。

            【讨论】:

              【解决方案6】:

              发送包含错误消息和错误号的电子邮件是一种更有效的方式,不能指望最终用户报告他们发现的每一个失败。但是电子邮件会失败。 SAP 或 Ariba 很容易在某个时候发送电子邮件。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-08-27
                • 2011-04-15
                • 2021-02-01
                • 2012-09-17
                • 2014-03-08
                • 2021-09-09
                • 2016-08-18
                • 2015-03-23
                相关资源
                最近更新 更多