有不同的方式记录消息,按死亡顺序排列:
致命的错误警告信息调试,调试跟踪
我如何决定何时使用哪个?
什么是好的启发式方法?
有不同的方式记录消息,按死亡顺序排列:
致命的错误警告信息调试,调试跟踪
我如何决定何时使用哪个?
什么是好的启发式方法?
当前回答
可以从中恢复的警告。错误你不能。这是我的启发,其他人可能有其他想法。
例如,假设您在应用程序中输入/导入名称“Angela Müller”(注意u上的元音变音)。您的代码/数据库可能仅为英文(尽管它可能不应该在这个时代),因此可能会警告所有“不寻常”字符都已转换为普通英文字符。
与之形成对比的是,尝试将信息写入数据库,并连续60秒返回网络关闭消息。这与其说是警告,不如说是错误。
其他回答
在此之前,我已经构建了以下系统:
错误-表示出现了严重错误,特定线程/进程/序列无法继续。需要一些用户/管理员干预警告-有些事情不正确,但过程可以照常进行(例如,一组100个作业中的一个作业失败,但剩余的作业可以处理)
在我所构建的系统中,管理员都在接受指示,以应对错误。另一方面,我们将观察警告,并确定每种情况是否需要任何系统更改、重新配置等。
我发现从查看日志文件的角度考虑严重性更有用。
致命/严重:应立即调查的整体应用程序或系统故障。是的,唤醒SysAdmin。因为我们更喜欢SysAdmins警报,并且休息良好,所以应该很少使用这种严重性。如果它每天都在发生,而这不是BFD,那么它就失去了意义。通常,致命错误在进程生命周期中只发生一次,因此如果日志文件与进程绑定,这通常是日志中的最后一条消息。
错误:肯定是一个应该调查的问题。SysAdmin应该被自动通知,但不需要被拖下床。通过过滤日志以查看错误和以上内容,您可以获得错误频率的概述,并可以快速识别可能导致额外错误级联的初始故障。跟踪错误率与应用程序使用率之间的关系可以得出有用的质量指标,如MTBF,可用于评估总体质量。例如,这个度量可能有助于在发布之前决定是否需要另一个测试周期。
警告:这可能是问题,也可能不是。例如,预期的瞬时环境条件(如网络或数据库连接短暂中断)应记录为警告,而不是错误。查看经过筛选的日志以仅显示警告和错误,可以快速了解后续错误的根本原因的早期提示。警告应谨慎使用,以免变得毫无意义。例如,失去网络访问应该是服务器应用程序中的一个警告,甚至是一个错误,但可能只是为偶尔断开连接的笔记本电脑用户设计的桌面应用程序的一个信息。
信息:这是在正常情况下应记录的重要信息,如成功初始化、服务启动和停止或重要事务的成功完成。查看显示“信息”及以上内容的日志应该可以快速概述流程中的主要状态更改,为理解任何警告或错误提供顶级上下文。不要有太多信息消息。相对于跟踪,我们通常有<5%的信息消息。
跟踪:跟踪是迄今为止最常用的严重性,应该提供上下文以了解导致错误和警告的步骤。拥有正确的跟踪消息密度可以使软件更易于维护,但需要一定的努力,因为随着程序的发展,单个跟踪语句的价值可能会随着时间的推移而变化。实现这一点的最佳方法是让开发团队养成定期查看日志的习惯,作为解决客户报告问题的标准部分。鼓励团队删除不再提供有用上下文的跟踪消息,并在需要时添加消息以了解后续消息的上下文。例如,记录用户输入(如更改显示或选项卡)通常很有用。
调试:我们考虑Debug<Trace。区别在于调试消息是从发布版本编译出来的。也就是说,我们不鼓励使用调试消息。允许调试消息往往会导致越来越多的调试消息被添加,而从未删除过。随着时间的推移,这使得日志文件几乎无用,因为它太难从噪声中过滤信号。这导致开发人员不使用继续死亡螺旋的日志。相反,不断修剪Trace消息会鼓励开发人员使用这些消息,从而形成良性循环。此外,这消除了由于调试代码中所需的副作用而引入bug的可能性,这些副作用未包含在发布版本中。是的,我知道这不应该发生在好的代码中,但安全总比抱歉好。
你想让系统管理员半夜起床吗?
是->错误无->警告
我一般同意以下约定:
跟踪-只有当我“跟踪”代码并试图找到函数的某一部分时。调试-对开发人员(IT、系统管理员等)以外的人有诊断帮助的信息。信息-要记录的一般有用信息(服务启动/停止、配置假设等)。我想随时提供信息,但在正常情况下通常不关心。这是我的开箱即用配置级别。警告-任何可能导致应用程序异常的情况,但我会自动恢复。(例如从主服务器切换到备份服务器、重试操作、丢失辅助数据等)错误-任何对操作(而不是服务或应用程序)致命的错误(无法打开所需的文件、丢失的数据等)。这些错误将迫使用户(管理员或直接用户)进行干预。这些通常是为不正确的连接字符串、丢失的服务等保留的(在我的应用程序中)。致命-强制关闭服务或应用程序以防止数据丢失(或进一步数据丢失)的任何错误。我只为最令人发指的错误和保证存在数据损坏或丢失的情况保留这些。
如果你能从问题中恢复过来,那就是一个警告。如果它阻止了继续执行,那就是一个错误。