调试(Debug)是成为一个程序员的基础。调试这个词第一个含义即是移除错误,但真实的含义是,通过检查来观察程序的运行。一个不会调试的程序员等同于瞎子。
为了获得一个程序执行过程的可见性,你必须能够执行代码并且从这个过程中观察到什么。有时候这是显而易见的,比如一些正在呈现在屏幕上的东西,或者两个事件之间的延迟。在许多其他的案例中,调试与一些不一定可见的东西相关,比如代码中一些变量的状态,哪一行代码正在被执行,或者一些断言是否持有了一个复杂的数据结构。这些隐藏的细节必须被显露出来。
观察一个正在执行程序的内部的方法通常可按如下分类:
- 使用调试工具(比如IDE中的Debugger);
- Printlining - 对程序做一个临时的修改,通常是加一些行去打印一些信息;
- 日志 - 用日志的形式为在程序的运行中创建一个永久的视窗。
当调试工具稳定可用时,它们是非常美妙的,但 Printlining 和写日志甚至是更加重要的。调试工具通常落后于编程语言的发展,所以在某些时候它们都可能是无效的。另外,调试工具可能轻微改变程序实际执行的方式。最后,调试有许多种,比如检查一个断言和一个巨大的数据结构,这需要写代码并改变程序的运行。当调试工具可用时,知道如何使用调试工具是一件好事,但学会使用其他两种方式也是至关重要的。
简单来说,日志是调试的一种方式。
日志提供了下面三个基本的优点:
- 日志可以提供一些难以重现的 bug 的有效信息,比如在产品环境中发生的、不能在测试环境重现的 bug。
- 日志可以提供统计和与性能相关的数据,比如语句间流逝过的时间。
- 可配置的情况下,日志允许我们获取普通的信息,使得我们可以在不修改或重新部署代码的情况下调试以处理具体的问题。
打印日志规范
Java日志体系
Java日志框架
日志框架教程学习(包括logback,log4j,jcl,slf4j)