有不同的方式记录消息,按死亡顺序排列:
致命的错误警告信息调试,调试跟踪
我如何决定何时使用哪个?
什么是好的启发式方法?
有不同的方式记录消息,按死亡顺序排列:
致命的错误警告信息调试,调试跟踪
我如何决定何时使用哪个?
什么是好的启发式方法?
当前回答
国庆节,
作为这个问题的必然结果,沟通您对日志级别的解释,并确保项目中的所有人都对级别的解释保持一致。
看到各种各样的日志消息,其中的严重性和所选日志级别不一致,这很痛苦。
如果可能,请提供不同日志记录级别的示例。并且要在消息中记录的信息保持一致。
HTH
其他回答
顺便说一句,我非常喜欢捕捉一切,然后过滤信息。
如果您在“警告”级别捕获,并希望获得与警告相关的一些调试信息,但无法重新创建警告,会发生什么情况?
捕获所有内容并稍后过滤!
即使对于嵌入式软件,这也是正确的,除非你发现你的处理器跟不上,在这种情况下,你可能需要重新设计你的跟踪以使其更高效,或者跟踪干扰了时间(你可能会考虑在一个更强大的处理器上调试,但这会带来另一种蠕虫)。
捕获所有内容并稍后过滤!!
(顺便说一句,捕获一切也很好,因为它让您可以开发工具来做更多的工作,而不仅仅是显示调试跟踪(我从中绘制了消息序列图,以及内存使用情况的直方图。它还为您提供了一个基础,以便在将来发生错误时进行比较(保留所有日志,无论是通过还是失败,并确保在日志文件中包含内部版本号))。
下面是“伐木工人”的清单。
Apache日志4j:§1,§2
致命:[v1.2:..]非常严重的错误事件,可能会导致应用程序中止。[v2.0:..]严重错误,将阻止应用程序继续运行。错误:[v1.2:..]可能仍然允许应用程序继续运行的错误事件。[v2.0:..]应用程序中的错误,可能可以恢复。警告:[v1.2:..]潜在的有害情况。[v2.0:..]事件可能导致错误。信息:[v1.2:..]在粗粒度级别突出显示应用程序进度的信息性消息。[v2.0:..]事件,仅供参考。调试:[v1.2:..]对调试应用程序最有用的细粒度信息事件。[v2.0:..]常规调试事件。跟踪:[v1.2:..]比DEBUG更细粒度的信息事件。[v2.0:..]细粒度调试消息,通常捕获通过应用程序的流。
Apache Httpd(和往常一样)喜欢过度使用:§
紧急情况:紧急情况–系统不可用。警觉的:必须立即采取行动[但系统仍然可用]。比容:关键条件[但无需立即采取行动]。套接字:无法获取套接字,正在退出子级错误:错误条件[但不重要]。“脚本头过早结束”警告:警告条件。[接近错误,但不是错误]通知:正常但显著的情况。httpd:捕获SIGBUS,试图在中转储核心信息:信息[和不可旋转]。[“服务器已运行x小时。”]调试:调试级消息[,即为调试而记录的消息)]。“正在打开配置文件…”痕迹1→ 痕迹6:跟踪消息[,即为跟踪而记录的消息]。“代理:FTP:控制连接完成”“proxy:CONNECT:向远程代理发送CONNECT请求”“openssl:握手:启动”“从缓冲SSL旅读取,模式0,17字节”“地图查找失败:map=rewriteitemap key=keyname”缓存查找失败,强制新的映射查找痕迹7→ 痕迹8:跟踪消息,转储大量数据“|0000:02 23 44 30 13 40 ac 34 df 3d bf 9a 19 49 39 15 |”“|0000:02 23 44 30 13 40 ac 34 df 3d bf 9a 19 49 39 15 |”
Apache commons日志记录:§
致命:导致提前终止的严重错误。期望这些在状态控制台上立即可见。错误:其他运行时错误或意外情况。期望这些在状态控制台上立即可见。警告:使用不推荐使用的API、API使用不当、“几乎”错误、其他不希望或意外但不一定“错误”的运行时情况。期望这些在状态控制台上立即可见。信息:有趣的运行时事件(启动/关闭)。期望这些在控制台上立即可见,所以要保守,尽量减少。调试:有关通过系统的流程的详细信息。期望这些仅写入日志。跟踪:更详细的信息。期望这些仅写入日志。
Apache commons记录企业使用的“最佳实践”,根据调试和信息跨越的界限来区分它们。
边界包括:
外部边界-预期异常。外部边界-意外异常。内部边界。重要内部边界。
(有关详细信息,请参阅commons日志记录指南。)
我建议采用Syslog严重级别:调试、信息、通知、警告、错误、严重、警报、紧急。看见http://en.wikipedia.org/wiki/Syslog#Severity_levels
它们应该为大多数用例提供足够的细粒度严重性级别,并被现有的日志解析器识别。当然,您可以根据应用程序的要求,自由地只实现一个子集,例如调试、错误、紧急情况。
让我们对已有多年的应用程序进行标准化,而不是为我们制作的每个不同应用程序制定自己的标准。一旦您开始聚合日志并尝试检测不同日志之间的模式,这将非常有用。
可以从中恢复的警告。错误你不能。这是我的启发,其他人可能有其他想法。
例如,假设您在应用程序中输入/导入名称“Angela Müller”(注意u上的元音变音)。您的代码/数据库可能仅为英文(尽管它可能不应该在这个时代),因此可能会警告所有“不寻常”字符都已转换为普通英文字符。
与之形成对比的是,尝试将信息写入数据库,并连续60秒返回网络关闭消息。这与其说是警告,不如说是错误。
微软如何在其新的准标准Microsoft.Extension.Logging中定义不同的LogLevel值非常有趣(重点是我的):
批评的描述不可恢复的应用程序或系统崩溃或需要立即关注的灾难性故障。错误当前执行流停止时突出显示的日志失败。这些应指示当前活动中的故障,而不是应用程序范围内的故障。警告突出显示应用程序中异常或意外事件的日志但不会导致应用程序执行停止。信息跟踪应用程序一般流程的日志。这些日志应该具有长期价值。调试开发期间用于交互式调查的日志。这些日志应主要包含对调试有用的信息并且没有长期价值。查出包含最详细消息的日志。这些消息可能包含敏感应用程序数据。这些消息被禁用默认设置,在生产环境中永远不应启用。