管理异常的错误日志记录的最佳方法是什么?


13

介绍

如果网站或系统上发生错误,则将其记录下来并向用户显示带有错误代码的礼貌消息当然是有用的。

而且,如果您有许多系统,则不希望散布这些信息-最好有一个集中的位置。

在最简单的级别上,所需要做的就是增加ID和错误详细信息的序列化转储。(可能的“集中位置”是电子邮件收件箱。)

另一方面,也许是一个完全规范化的数据库,该数据库还允许您按下按钮并查看每天的错误图,或者确定系统X上最常见的错误类型是服务器A是否拥有更多的数据库。服务器B的连接错误,等等。

我在这里指的是通过远程系统记录代码级错误/异常- 而不是 “基于人的”问题跟踪,例如使用Jira,Trac等进行的跟踪。


问题

我正在寻找使用过这种系统的开发人员的想法,特别是关于以下方面的想法:

  • 您不能没有哪些基本功能?
  • 真正节省您时间的功能有什么好处?
  • 哪些功能似乎是个好主意,但实际上没有用吗?

例如,我想说一个“显示重复项”功能很重要,它可以识别多次出现的错误(而不必担心可能会有所不同的“不重要”细节)。
用于“在[Jira / etc]中为此错误创建问题”的按钮听起来像是节省了时间。

再次重申一下,我所追求的是使用过此类系统的人们的实践经验,最好是对功能令人敬畏/可怕的原因进行备份。
(无论如何,如果要进行理论化,至少要这样标出答案。)


2
要记住的一件事:如果您正在记录某些内容,则说明出现了问题,并且可能有不止一件事。使日志记录操作保持简单。
David Thornley,2010年

在调试或信息级别记录日志并不一定意味着有任何错误。例如,它可能包含事后分析所需的信息。

我已经看到了异常记录器,它们自己在String.Format(C#):)上引发了异常。保持登录简单,最好是无风险,并且不是动态的(例如,在尝试记录异常时不要解析XML文件)。如果可以,请避免错误记录中的动态性。如果您在xml文件中配置了东西,我认为最好在此基础上生成一些实际的代码(实体),而不是在运行时报告错误(动态)时在运行时解析该配置文件。 )。无论如何,那是我的经验。你可能希望有记录B计划-如果看中outputing失败,登录简单
招聘

Answers:


5

我曾经在一个项目中使用Microsoft Enterprise库记录了客户端错误。发送到我们邮箱的所有例外。在邮件主题中,我们添加了序列化错误的哈希码,以避免重复的消息。当然可以将序列化消息存储在数据库中,依此类推。

我建议您检查Microsoft Enterprise库Log4Net

Log4Net的某些功能

  • 支持多种框架
  • 输出到多个记录目标
  • 分层日志记录架构
  • XML配置
  • 动态配置
  • 记录上下文
  • 经过验证的架构
  • 模块化和可扩展设计•高性能和灵活性

1
一个好的记录器将使您将错误推送到您选择的持久性(电子邮件,数据库,文件等)。
肯·亨德森

1

对于数据库应用程序,使用某种ID(如<TABLE>:<PrimaryKeyID>)来跟踪与捕获异常的范围相关的数据库中的记录。

我已经用Oracle和PL / SQL完成了,将ID从异常处理程序记录到应用程序内的数据库表中。


至少记录正在处理的表和记录绝对好。当然,更好的方法是尝试使用SQL语句(和任何参数)。
彼得·布顿

1

正如Amir Rezaei所指出的那样,您所描述的大部分内容(即记录日志的特定部分)都在企业库中实现。其他所有内容似乎都更多地属于分析部分(即,之后如何处理日志)。

就我而言,我创建了一些小应用程序和sql脚本,使某些事情变得更容易。这是我真正喜欢的一些东西:

  • 将相同错误归为一组(即,大约100个用户在同一时间都遇到了相同的错误是一份错误报告,其中记录了发生的次数)
  • 在案例跟踪器中自动提交票证(从未设法“单击按钮”,但是一直希望这样做)
  • 软件用户的用户名(不仅是机器,大多数记录器都可用)。在某些情况下,自动用户帐户会引起问题,而在另一些情况下,特定用户是问题的原因。“我需要看Mike做些工作,他一直在引起特定的错误。”
  • “用户操作”-我有一个全局堆栈,该堆栈将跟踪用户操作时每一次可操作的单击/按钮按下并将其附加到错误日志中。重现错误通常是遍历该跟踪并执行与用户相同的步骤的情况(我曾希望构建一个CodedUI测试生成器来解析该跟踪并自动执行这些步骤,但从未这样做)

0

有时,日志信息量太大,无法存储在磁盘上。我见过的一种方法是将您的日志记录条目写入firehose(例如perl)中,如下所示:

# Create socket.
my $sock = IO::Socket::INET->new(
    Proto       => 'udp',
    PeerAddr    => $bcastaddr,
    Broadcast   => 1,
) or die "Can't create socket ($bcastaddr): $!";

while (<>) {
    chomp;
    unless (/File\ does\ not\ exist:/) {
        $sock->send("$eventtype:$_") or warn "Can't send: $!";
    }
}

然后分析师可以找出他/她想要看的东西。


3
不确定什么是“消防水带”?考虑到当今磁盘的容量,我希望错误不会那么普遍,以至于日志大小会成为问题。
彼得·布顿

0

这是我从应用程序中的错误监视中学到的一些东西:

  • 能够尾随滚动日志文件(我通常使用log4net / log4j登录应用程序,使用BareTail跟踪日志)对于检查系统的当前运行状况非常有用。
  • 为了了解何时引入问题以及发生问题的速度,最好将它们包含在带有时间戳的数据库中,以便您运行报告。
  • 发送电子邮件/短信/语音警报的功能对于确保系统正常运行非常有帮助,但是您必须能够轻松自定义警告您的错误类型。如果您每天收到800封错误电子邮件,那么您肯定会错过“哦,数据中心着火了”。

对于log4net,我取得了不错的成绩,因为它使登录多个位置变得非常容易,并且使记录配置的更改也变得很容易。


0

elmah是用于ASP.NET应用程序的开源错误日志记录系统,可以快速,轻松地将其添加到现有系统中(使用NuGet http://nuget.codeplex.com/)。它支持各种后端和通知功能。

我不知道有人将它添加到桌面应用程序中,因为它作为网站运行,但是没有什么阻止您将其作为服务运行并通过网络将您的异常发布到桌面应用程序。

http://code.google.com/p/elmah/

ELMAH(错误记录模块和处理程序)是应用程序范围的错误记录工具,可以完全插入。它可以动态添加到计算机上正在运行的ASP.NET Web应用程序甚至所有ASP.NET Web应用程序中,而无需重新编译或重新部署。

将ELMAH放入正在运行的Web应用程序并进行适当配置后,您将获得以下功能,而无需更改代码的任何一行:

  • 记录几乎所有未处理的异常。
  • 一个网页,可远程查看重新编码的异常的整个日志。
  • 一个用于远程查看任何一个记录的异常的完整详细信息的网页,包括彩色堆栈跟踪。
  • 在许多情况下,即使关闭了模式,您也可以查看ASP.NET为给定异常生成的原始黄色死亡屏幕customErrors
  • 每种错误发生时的电子邮件通知。
  • 来自日志的最后15个错误的RSS feed ...

ELMAH不可靠。如果HttpContext的是NULL ==>繁荣
困惑

@Quandary我想知道我是否缺少什么?当尝试从应用程序登录到ELMAH并且HttpContext为null时,我们会看到一个错误,但是如果您具有root级别catch->创建具有空context和log的新的elmah logger,则它可以正常工作。普通的ASP.NET网站中是否存在可以尝试登录并HttpContext为null的地方?
伊恩·格兰杰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.