需要我的错误记录机制的评论评论

时间:2009-03-31 04:39:25

标签: logging exception-handling

在生产/质量保证/开发的每一次休息中,到达异常的根源都是非常关键和时间的过程。

由于Web应用程序处于多用户环境和无状态\异步(HTTP)中,因此查看Eventviewer /日志文件和根本导致最终用户报告的问题确实非常困难;此外,它取决于最终用户如何教育细节解释问题。

我想出了一种记录异常的创造性方法。这使得最终用户和开发团队的工作更轻松?

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

错误记录类中的静态方法的签名如下

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

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

回复用户回复:

如果预计会处理和使用Exception,那么开发人员就会向最终用户显示有效的用户友好消息。将任何意外或异常引发到应用程序层(全局.asax),将清除响应,并将HTML中的自定义消息写回具有唯一ID的用户,如下所示

“发生了意外错误,已记录异常以便采取进一步行动;请使用#生成的唯一号码与支持团队进行沟通“

参数详情:

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

公共字符串strExceptionID {

      Get { 

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

          }    

     }

模块名称:这是一个带模块名称的静态枚举变量 例如: 枚举ModuleName {

    Module1, 

    Module2, 

    Module3  };

优先级:这将是具有优先级的静态枚举变量,开发人员必须确定优先级,如果它是日期或整数格式的验证失败使用“低”或者如果它在业务层调用中意外,则使用“2” 。

我认为Priority High只应在DAL或业务逻辑层中使用,或者如果SAP或Ariba的接口失败则应该使用。 例如:枚举优先级{

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

图层:

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

      Presentation, 
      Business, 
      DataAccess 
            };

String Custom Message:

这是可选参数,由开发人员提供信息以帮助解释Reason或Empty字符串。

Stack Trace的异常:这将是Exception对象,它将在方法中进一步处理。

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

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

优点:

- > XML Logging将使我们能够以任何方式处理它 - >可以在浏览器中远程查看例外。 - >易于追踪并发现任何异常。 - >我们可以根据模块,优先级,时间戳,用户ID等搜索,排序异常 - >我们可以生成报告@ Module level,Layer wise,Priority,Time ...

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

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

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

6 个答案:

答案 0 :(得分:3)

我有一个小问题,人们重写跟踪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}”,       userInput,       前       );

无论如何 - 我想我所说的是,如果你在.NET中写这个就像你看起来那样 - 花半天时间浏览System.Diagnostics文档。您可能无需编写API。

答案 1 :(得分:0)

我有两个评论:

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

强调先前审稿人的观点:如果竞争条件导致失败,您可能可能在同一毫秒内获得多个例外。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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