HOWTO · Java
Java 中的 console.log:控制台输出与日志
了解 JavaScript 的 console.log 与 Java 控制台输出的区别,并学习使用 System.out.println、java.util.logging、Log4j 和 SLF4J 配合 Logback 记录消息。
本页内容
Java 没有内置的 console.log 函数;这个名称属于 JavaScript。若要在 Java 程序中快速显示一条消息,可以使用 System.out.println。如果应用需要日志级别、可配置的输出位置或统一的格式,则应使用日志 API 或框架。
使用 System.out.println
System.out.println 会将一个值写入标准输出,并在末尾换行。下面这个完整的 Java 程序会打印一条问候语:
public class ConsoleExample {
public static void main(String[] args) {
String message = "Hello, Java!";
System.out.println(message);
}
}
Hello, Java!
程序会将 message 的值写入标准输出。对于小型命令行程序、临时诊断信息,或需要显示给运行程序的用户的内容,这种方式很合适。它简单易用,但不提供日志级别、时间戳或可配置的输出位置。在较大的应用中,散落各处的打印语句更难筛选和管理。
如果你希望使用熟悉的调用形式,也可以自己编写一个包装类:定义 Console 类,并添加一个 static void log(String message) 方法,让方法体调用 System.out.println(message),然后调用 Console.log("Ready")。Console.log 是你自己编写的代码,并非 Java 内置 API;这样做也不会让 Java 获得 JavaScript 的 console.log。
使用 Java 日志框架
日志 API 让代码能够按严重程度记录消息,而日志实现则负责格式化消息,并将其输出到控制台或文件等位置。常见级别可以区分诊断信息、警告和错误。通过配置可以控制显示哪些消息以及输出到哪里,因此常规输出不必与应用日志混在一起。
Java 标准库内置了 java.util.logging。如果你希望使用日志 API,又不想添加第三方依赖,这是一个实用选择。Log4j 是独立的日志实现,支持配置追加器和布局。SLF4J 则有所不同:它是一个门面,为应用代码提供统一的日志 API;要实际生成日志,还需要兼容的提供程序或绑定。除非有明确的集成需求需要桥接或组合日志系统,否则一个应用最好选择一种日志实现。
下面是一个简短的 java.util.logging 示例:使用 Logger logger = Logger.getLogger(MyClass.class.getName()); 获取记录器,然后调用 logger.info("Service started");、logger.warning("Retrying request"); 或 logger.severe("Request failed");。这些调用使用 JDK 内置的日志配置,因此不需要额外依赖。使用默认控制台处理器时,典型日志行会包含时间戳、级别和消息,例如 INFO: Service started;完整前缀和启用的级别取决于运行时日志配置。这只是对 API 及其常见格式的说明,并非实际运行结果。
使用 SLF4J 与 Logback
若要在 Maven 项目中使用 SLF4J 和 Logback,请添加 org.slf4j:slf4j-api 依赖,以及兼容版本的 ch.qos.logback:logback-classic 提供程序。后者为 SLF4J API 提供 Logback 实现。请通过项目的依赖管理选择版本;较早示例中的版本可能已不再合适,因此本文不会将某一固定版本组合称为当前版本。
在 Java 类中,声明 private static final Logger logger = LoggerFactory.getLogger(MyClass.class);,然后通过 logger.info("Service started")、logger.warn("Retrying request") 或 logger.error("Request failed", exception) 等调用记录消息。最后一种形式会传入异常,以便后端记录其堆栈跟踪。将 Logback 放入运行时类路径后,提供程序会根据配置处理这些调用。例如,控制台配置可能显示 INFO MyClass - Service started;这是代表性格式,并非观察到的运行结果。实际阈值、格式和输出位置取决于 Logback 配置。让应用代码通过 SLF4J 调用日志 API,日后更换提供程序时,对使用该门面的代码影响会更小。
总结
小型程序只需直接向控制台输出内容时,使用 System.out.println 即可。应用若需要严重程度级别、配置能力和可选输出位置,则应使用 Log4j 或 Logback 等日志实现。java.util.logging 已包含在 Java 标准库中,而 SLF4J 提供门面,可将应用代码连接到 Logback 等提供程序。
常见问题
Java 中的日志有什么用途? 日志会记录事件,帮助你了解应用正在执行什么、诊断问题并监控运行情况。请避免在日志消息中记录机密或其他敏感值。
日志级别有什么作用? debug、info、warn 和 error 等级别可以将诊断细节与重要事件和故障区分开来。配置可以设置阈值,以控制哪些级别的消息会被输出。
一个应用可以使用多个日志框架吗? 可以同时引入多个日志系统或桥接组件,但这会增加配置复杂度,也可能造成重复输出。更好的做法是选择一个后端;若某个依赖使用了另一种日志 API,再有针对性地配置桥接。
SLF4J 本身是日志后端吗? 不是。SLF4J 是一个门面。你还需要添加兼容的提供程序(例如 Logback),以便由某个实现处理通过该门面发出的调用。
什么时候应该选用日志框架,而不是 System.out.println? 当你需要按级别筛选消息、通过配置更改输出位置或格式,或在应用各组件间统一管理日志时,应选择日志框架。对于短小程序或只需显示单个结果的情况,通常使用 System.out.println 就足够了。