题
在我工作的公司,我创建了一个错误日志记录类来处理 ASP.net 应用程序中的错误。它是一个自定义类,因为我们不允许在我们的服务器上安装其他软件(nLog、log4net 等)。
我目前在我的两个项目中使用它,并看到了一些不错的结果。现在我正在捕获导致页面和应用程序错误的错误。它发送并存储错误消息和所有内部异常。
我现在遇到的问题是,我收到错误,但不太确定如何重现。我还没有听到任何用户的错误报告。我不确定他们在做什么,或者即使他们将这些视为错误。
我正在考虑在每个页面上创建一个事件日志,或者在我想要更多信息的页面上创建一个事件日志。将其作为页面上的会话变量保存,并向其写入事件(函数的开始/结束、变量更改等)。然后,仅当调用错误时,才会将其与错误消息一起发送,以查看它是否可以更好地了解正在发生的情况。我希望,当所有用户访问该应用程序时,这样做不会给我带来大量的事件日志,而只是希望在某个用户发生错误之前发生。
你知道我在方法上应该注意哪些陷阱吗?
对于要寻找的东西,您有什么建议吗?
更新:
@萨雷特:我明白你的回答是从哪里来的,我同意。我对这家公司还很陌生,仍然需要学习他们是如何做事的。过去,我曾与同事讨论过如果拥有这个产品或使用这个开源项目该有多好。问题归根结底是,我们致力于安全系统的开发,获得这些东西的批准需要花费大量时间,并处理所有的繁文缛节。我将进一步调查这种情况,因为我相信拥有一个良好的错误记录系统很重要,但目前还没有使用任何系统。
@吉姆暴雪:我想尝试摆脱在某个地方记录/存储所有内容的情况,然后回来找出对于导致错误的情况来说什么是重要的。我不想陷入罗伯托·巴罗斯链接的文章中讨论的过多信息。我当前的想法是,在每个页面上的内存中保存一个字符串,如果在页面 Page_Error 事件上引发错误,则获取该字符串并将其附加到正在记录的异常中。这样我只记录发生的错误/异常并存储包含该错误的事件日志。如果没有发生任何事情,正在创建的日志将被放入位桶中,再也不会被看到。
@罗伯托·巴罗斯:感谢您提供的链接,我记得在某个地方读过它,但忘记保存它。
解决方案
这可能不是您正在寻找的确切答案,但是为什么在有强大的工具(您提到)为您处理所有这些关键问题时开发自己的错误记录机制?
我很感激您不允许安装其他软件,但不会像自定义代码那样记录库吗?根本区别在哪里?我认为花在担心实施日志框架上的时间可能会更好地用于提倡和制定适当的日志记录解决方案的商业案例。
其他提示
我曾经为一家代理商工作,该代理商不允许安装任何不纯粹是我自己的代码或其(可怕的)COM对象的东西。如果您有此类限制,请查看是否可以获取log4net的源并包含在项目中。
当涉及到日志记录时,没有比log4net更好的了。
我个人采用以下方法在 ASP.NET 应用程序中记录错误(并且仅记录错误):
使用
protected void Application_Error(object sender, EventArgs e) { Server.Transfer("~/Support/ServerErrorSupport.aspx", true); }
(我做了一个Server.Transfer
以保留所有发布数据。)生成该错误唯一的错误 ID(以便可以对同一错误的后续报告进行分组)。ID 是根据连接字符串计算得出的哈希值,其中包含:文件、方法、行号和错误消息。我通过堆栈跟踪上的正则表达式获取文件、方法和 lineNr 值。
我将以下所有数据记录到 xml 结构中(根据数据类型,我以不同的方式存储值,值类型 => ToString()、ISerialized => 序列化,...):
- 机器名称:应用程序.服务器.机器名称
- 物理根:Application.Server.MapPath("~/")
- 请求网址:Application.Request.Url.ToString()
- 应用程序设置:WebConfigurationManager.AppSettings
- 连接设置:WebConfigurationManager.ConnectionStrings
- 请求参数:应用程序.请求.查询字符串
- 表格邮寄:申请.请求.表格
- 会议:应用程序.会话
- Http 标头:应用程序.请求.标头
将 xml 结构保存为包含错误 ID 和时间戳的本地文件。我选择这种方法是因为:
- 我可以将关系(xml 文件)邮寄给自己(在测试/调试期间非常容易)
- 在生产过程中将其存储在本地或数据库中
- 因为该文件只是一个(转储到硬盘)保存,在创建错误报告期间不会出现太多问题(例如服务器连接、数据库问题等),只需确保您具有写入权限即可。
- 此外,在 servererrorsupport.aspx 页面上,保存 xml 文件后,用户可以选择包含额外信息并添加电子邮件地址,以随时了解有关错误的最新进展。这会附加到 xml 文档中。
- 我使用 xslt 文件将错误数据 (xml) 格式化为漂亮的错误报告。
对于错误,我是记录A LOT的忠实粉丝。当出现问题时,信息非常有价值。我会将整个日志保存在一个地方(文本文件或数据库表)中,并带有会话标识符,以便将相关事件组合在一起。
这是我喜欢记录的内容:
- 错误/调试级别(信息、调试、问题、崩溃等...)
- 时间
- 描述性文字(通常一行)
- 堆栈跟踪(如果可能)
- 数据(用户、会话、变量值等...)
最简单的方法是写入文本文件,但最好将其保存在数据库中。您还可以使用 Windows 事件日志。有些事情需要注意。唔...您需要定期清除日志。
好笑的故事:有一次,我们有一个错误记录器记录到数据库,但我们的数据库凭据错误,导致错误被记录......最终导致递归堆栈溢出(IIRC)。