企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### [日志会给出正在运行的程序的各种信息。](https://lingcoder.gitee.io/onjava8/#/book/16-Validating-Your-Code?id=%e6%97%a5%e5%bf%97%e4%bc%9a%e7%bb%99%e5%87%ba%e6%ad%a3%e5%9c%a8%e8%bf%90%e8%a1%8c%e7%9a%84%e7%a8%8b%e5%ba%8f%e7%9a%84%e5%90%84%e7%a7%8d%e4%bf%a1%e6%81%af%e3%80%82) 在调试程序中,日志可以是普通状态数据,用于显示程序运行过程(例如,安装程序可能会记录安装过程中采取的步骤,存储文件的目录,程序的启动值等)。 在调试期间,日志也能带来好处。 如果没有日志,你可能会尝试通过插入**println()**语句来打印出程序的行为。 本书中的一些例子使用了这种技术,并且在没有调试器的情况下(下文中很快就会介绍这样一个主题),它就是你唯一的工具。 但是,一旦你确定程序正常运行,你可能会将**println()**语句注释或者删除。 然而,如果你遇到更多错误,你可能又需要运行它们。因此,如果能够只在需要时轻松启用输出程序状态就好多了。 程序员在日志包可供使用之前,都只能依赖 Java 编译器移除未调用的代码。 如果**debug**是一个 \*\*static final boolean \*\*,你就可以这么写: ~~~ if(debug) { System.out.println("Debug info"); } ~~~ 然后,当 \*\*debug \*\*为 \*\*false \*\*时,编译器将移除大括号内的代码。 因此,未调用的代码不会对运行时产生影响。 使用这种方法,你可以在整个程序中放置跟踪代码,并轻松启用和关闭它。 但是,该技术的一个缺点是你必须重新编译代码才能启用和关闭跟踪语句。因此,通过更改配置文件来修改日志属性,从而起到启用跟踪语句但不用重新编译程序会更方便。 业内普遍认为标准 Java 发行版本中的日志包**(java.util.logging)**的设计相当糟糕。 大多数人会选择其他的替代日志包。如*Simple Logging Facade for Java(SLF4J)*,它为多个日志框架提供了一个封装好的调用方式,这些日志框架包括**java.util.logging**,**logback**和 \*\*log4j \*\*。 SLF4J 允许用户在部署时插入所需的日志框架。 SLF4J 提供了一个复杂的工具来报告程序的信息,它的效率与前面示例中的技术几乎相同。 对于非常简单的信息日志记录,你可以执行以下操作: ~~~ // validating/SLF4JLogging.java import org.slf4j.*; public class SLF4JLogging { private static Logger log = LoggerFactory.getLogger(SLF4JLogging.class); public static void main(String[] args) { log.info("hello logging"); } } /* Output: 2017-05-09T06:07:53.418 [main] INFO SLF4JLogging - hello logging */ ~~~ 日志输出中的格式和信息,甚至输出是否正常或“错误”都取决于 SLF4J 所连接的后端程序包是怎样实现的。 在上面的示例中,它连接到的是**logback**库(通过本书的**build.gradle**文件),并显示为标准输出。 如果我们修改**build.gradle**从而使用内置在 JDK 中的日志包作为后端,则输出显示为错误输出,如下所示: **Aug 16, 2016 5![40](https://github.githubassets.com/images/icons/emoji/40.png)31 PM InfoLogging main****INFO: hello logging** 日志系统会检测日志消息处所在的类名和方法名。 但它不能保证这些名称是正确的,所以不要纠结于其准确性。