Debugging 日志与调试

Debugging 日志与调试,debugging,logging,usability,messaging,Debugging,Logging,Usability,Messaging,背景:我继承了一个web应用程序,用于在本地和远程设备之间创建动态连接。最近有大量的活动部件:应用程序本身发生了重大变化;开发工具链刚刚更新;本地和远程设备都已“修改”以支持这些更改 好的一面是,它有一个合理的日志系统,可以将调试消息写入文件,并将日志记录到文件和实时用户屏幕。我有机会重新使用整个日志/调试机制 示例: 所有消息都带有时间戳,并以严重性级别作为前缀 日志是为客户准备的。他们记录系统对他/她的请求的响应 任何确定问题的日志都会提出解决方案 调试面向开发人员和技术支持。它们揭示了系

背景:我继承了一个web应用程序,用于在本地和远程设备之间创建动态连接。最近有大量的活动部件:应用程序本身发生了重大变化;开发工具链刚刚更新;本地和远程设备都已“修改”以支持这些更改

好的一面是,它有一个合理的日志系统,可以将调试消息写入文件,并将日志记录到文件和实时用户屏幕。我有机会重新使用整个日志/调试机制

示例:

  • 所有消息都带有时间戳,并以严重性级别作为前缀
  • 日志是为客户准备的。他们记录系统对他/她的请求的响应
  • 任何确定问题的日志都会提出解决方案
  • 调试面向开发人员和技术支持。它们揭示了系统的内部结构
  • 调试指示生成它们的函数和/或行
  • 客户可以动态调整调试级别以设置详细程度
问题:作为开发人员或消费者,您使用了哪些最佳实践来生成有用的日志和调试


编辑:目前有很多有用的建议,谢谢!澄清一下:我更感兴趣的是记录什么:内容、格式等——以及这样做的原因——而不是特定的工具

你所看到的最好的日志是什么使它们最有用的


谢谢你的帮助

对于任何日志框架来说,绝对最有价值的是一个“一键式”工具,它可以收集所有日志并将它们发送给我,即使应用程序部署在属于客户的机器上

并在记录内容上做出正确的选择,以便大致遵循应用程序中的主要路径

作为框架,我使用了标准(log4net、log4java、log4c++)


不要实现自己的日志框架,因为已经有一个现成的好框架。大多数这样做的人只是重新发明了轮子。

不要混淆日志记录、跟踪和错误报告,我认识的一些人会这样做,它创建了一个地狱般的日志文件供grep通过,以便获得我想要的信息

如果我想把所有东西都制作出来,我可以分为以下几类:

  • 跟踪->转储带有时间戳的每个操作和步骤以及输入和输出 该阶段的输出数据(最丑和 (最大文件)
  • 记录->仅记录业务流程步骤,客户不记录查询 查询准则及输出数据 没别的了
  • 错误报告/调试->记录异常,详细说明其位置 发生、时间戳、输入/输出 数据(如可能)、用户信息等
这样,如果出现任何错误,并且错误/调试日志没有包含足够的信息供我选择,我可以始终执行
grep-a 50-B 50'timestamp'跟踪文件
,以获取更多详细信息

编辑:
如前所述,以python内置日志模块为例,坚持使用标准包始终是好的。滚动您自己的不是一个好主意,除非该语言的标准库中没有。我确实喜欢将日志封装在一个小函数中,通常使用消息和值来确定它要访问哪些日志,即1-跟踪、2-日志、4-调试,以便向所有3个日志发送7个drop的值等。

使用现有的日志格式,如Apache使用的格式,然后,您可以借助许多可用于分析格式的工具。

我只需将您的日志系统设置为具有多个日志级别,在我编写的服务上,我对几乎每个操作都有一个日志/审核,并且分配了一个审核级别1-5,数量越高,您获得的审核事件越多。
  • 最基本的日志记录:启动、停止和重新启动
  • 基本日志记录:处理x个文件等
  • 标准日志记录:开始处理、完成处理等
  • 高级日志记录:处理过程中每个阶段的开始和结束
  • 一切:所采取的一切行动

  • 您可以在配置文件中设置审核级别,以便可以动态更改

    我发现一些一般的经验法则在服务器端应用程序中很有用:

    • requestID-为每个传入(HTTP)请求分配一个请求ID,然后将其记录在每个日志行上,以便您以后可以轻松地按该ID对这些日志进行grep,并找到所有相关行。如果您认为将该ID添加到每个日志语句中非常繁琐,那么至少java日志框架使用(MDC)使其变得透明
    • objectID-如果您的应用程序/服务处理的是操作某些具有主键的业务对象,那么将该主键附加到诊断上下文也是很有用的。稍后,如果有人问“这个对象是什么时候被操纵的?”您可以很容易地通过objectID grep并查看与该对象相关的所有日志记录。在这种情况下,实际使用MDC而不是MDC(有时)是有用的
    • 何时登录?-至少当您跨越重要的服务/组件边界时,您应该登录。这样,您可以在以后重构调用流,并深入到似乎导致错误的特定代码库
    作为一名Java开发人员,我还将介绍我在Java API和框架方面的经验

    API

    我建议使用(SLF4J)-根据我的经验,它是日志记录的最佳外观:

    • 功能全面:它没有遵循最小公分母的方法(如commons日志);相反,它使用的是优雅的降级方法
    • 几乎所有流行的Java日志框架都有适配器(例如log4j)
    • <