Java Logger

2025年3月26日 | 阅读 9 分钟

在 Java 中,日志记录是一项重要的功能,有助于开发人员跟踪错误。Java 是一种自带日志记录方法的编程语言。它提供了一个在 Java 1.4 版本中引入的日志记录 API。它提供了捕获日志文件的能力。在本节中,我们将深入探讨Java Logger API。此外,我们还将介绍日志级别、组件、日志处理器或附加器、日志格式化器或布局、Java Logger 类

Java 中的日志记录是什么?

Java 中,日志记录是一个 API,它提供了跟踪应用程序错误的能力。当应用程序生成日志调用时,Logger 会在 LogRecord 中记录该事件。之后,它会发送给相应的处理器或附加器。在将其发送到控制台或文件之前,附加器会使用格式化器或布局来格式化该日志记录。

日志记录的必要性

  • 它提供了应用程序的完整跟踪信息。
  • 它记录了应用程序中发生的任何严重故障。

日志记录组件

Java 日志记录组件供开发人员创建日志,并将这些日志以正确的格式传递给相应的目标。Java 日志记录 API 包含以下三个核心组件:

  • 日志记录器 (Loggers)
  • 日志处理程序或附加器 (Logging Handlers or Appender)
  • 日志格式化器或布局 (Logging Formatters or Layouts)

日志记录器 (Loggers)

客户端使用的代码将日志请求发送给 Logger 对象。这些 Logger 对象会跟踪它们感兴趣的日志级别,并拒绝低于此级别的日志请求。

换句话说,它负责捕获日志记录。然后,它将记录传递给相应的附加器。

通常,Logger 对象是命名实体。实体之间用点号 (.) 分隔。例如,java.net、java.awt 等。

命名空间由 LogManager 管理,并以分层顺序表示。它必须与打包命名空间对齐。但不必严格遵循。我们也可以创建一个匿名 Logger,但它不会出现在共享命名空间中。

在日志记录命名空间中,Logger 会搜索父 Logger。它是日志记录命名空间中最接近的现有祖先。请记住,根 Logger 没有父级。它会从其父级继承各种属性,例如:

  • 日志级别:如果设置为 null,它会向父级遍历并搜索第一个非 null 级别。
  • 处理程序:Logger 会将任何消息记录到父级的处理程序,递归地向上遍历树。
  • 资源包名称:如果任何 Logger 的资源包名称为 null,它会递归地向上遍历树,从其父级继承任何资源包名称。

日志处理程序或附加器 (Logging Handlers or Appender)

Java 日志记录 API 允许我们在 Java Logger 中使用多个处理程序,并且处理程序会相应地处理日志。Java 中有五种日志处理程序:

  • StreamHandler:它将格式化的日志消息写入 OutputStream。
  • ConsoleHandler:它将所有格式化的日志消息写入控制台。
  • FileHandler:它以 XML 格式将日志消息写入单个文件或一组轮换的日志文件。
  • SocketHandler:它将日志消息写入远程 TCP 端口。
  • MemoryHandler:它处理驻留在内存中的缓冲日志记录。

在 Java 日志记录 API 中,FileHandlerConsoleHandler 是默认提供的两个处理程序。通过继承 Handler 类或任何子类(如 MemoryHandler、StreamHandler 等),我们可以创建自己的类并自定义 Handler 类。附加器的选择取决于日志记录的要求。如果您不确定使用哪些附加器,它可能会影响应用程序的性能。

自定义 Java 日志记录处理程序的示例

日志格式化器或布局 (Logging Formatters or Layouts)

日志格式化器或布局用于格式化日志消息并将数据转换为日志事件。Java SE 提供了以下两个标准的格式化器类:

  • SimpleFormatter
  • XMLFormatter

SimpleFormatter

它生成包含一般信息的文本消息。它会写入人类可读的日志消息摘要。ConsoleHandler 使用此类将日志消息打印到控制台。例如,以下控制台消息显示:

XMLFormatter

XMLFormatter 以 XML 格式生成日志消息。它会写入详细的 XML 结构信息。它是 FileHandler 的默认格式化器。日志条目如下所示:

通过继承 Formatter 类,我们可以自定义并创建自己的 Formatter 类。我们可以将自定义类与任何处理程序一起使用。

如果您正在使用日志记录框架,则可以使用其他布局,如 HTMLJSON、Syslog、纯文本等。

自定义格式化器类的示例

Java 日志记录级别

它提供了日志消息的重要性与紧急程度的大致指南,并控制日志记录的详细程度。每个日志级别对象都有一个整数值。值越高表示优先级越高。总共有个级别,个标准日志级别和两个特殊日志级别。前三个日志级别 FINEST、FINER 和 FINE 表示详细的跟踪信息,包括应用程序正在发生什么以及应用程序中发生了什么。

Java Logger

下表显示了级别及其对应的数值。

序号。标准日志级别级别用途
1FINEST300专业开发人员信息
2FINER400详细开发人员信息
3FINE500一般开发人员信息
4CONFIG700配置信息
5INFO800一般信息
6WARNING900潜在问题
7SEVERE1000表示严重故障
8特殊日志级别OFFInteger.MAX_VALUE关闭日志记录
9ALLInteger.MIN_VALUE捕获所有内容

让我们详细讨论每个日志记录级别。

  • FINEST:表示高度详细的跟踪消息。
  • FINER:表示详细的跟踪消息,包括应用程序抛出的异常、方法的日志详细信息。
  • FINE:表示这些消息中最重要的一条。
  • CONFIG:表示与应用程序配置相关的信息。该信息可能包括磁盘和内存空间的使用量。
  • INFO:管理员或其他机构使用的用户信息。
  • WARNING:这是由于用户错误引起的。如果用户输入了错误的凭据,应用程序将显示警告。
  • SEVERE:当应用程序显示某些严重或可怕的错误时发生。在这种情况下,应用程序无法继续。严重级别的一个流行示例是内存不足和数据库不可用。

设置日志记录级别

我们可以使用以下语句来设置日志记录级别。

上面的语句将日志记录级别设置为 CONFIG,并提供与应用程序配置相关的信息。它还会从指定级别到更高级别生成日志。

假设我们将日志级别设置为 FINE,那么生成的日志将是 CONFIG、INFO、WARNINGSEVERE

我们还可以通过更改 Logger 的配置来将其设置为配置文件,如下所示:

日志事件

要在 Java 中记录事件,您必须确保分配一个级别以便轻松筛选出事件。要分配级别并提及消息,我们可以使用以下方法:

方法 1

在上面的语句中,我们指定了 INFO 级别,要打印的消息是 Display message

方法 2

Java 中的 Logger 只记录 INFO 级别或更高级别的事件,为此,我们使用 setLevel() 方法。

Java Log Manager

在 Java 中,LogManager 是一个属于 java.util.logging 包的类。它跟踪全局日志配置,创建和维护 Logger 实例。我们也可以使用它来设置自己的应用程序特定的配置。它包括以下两项:

  • 命名 Logger 的分层命名空间。
  • 一组日志控制属性,其中包含配置文件。

可以通过使用 getLogManager() 方法检索 LogManager。它会在我们创建 LogManager 时自动初始化。此属性允许容器应用程序(如 EJB 容器)用 LogManager 的子类替换默认类。

在 Java 中创建新的 Logger

我们可以使用 getLogger() 方法轻松地在 Java 中创建 Logger。如果 Logger 已定义,它会找到并返回相同的 Logger,否则会为命名子系统创建一个新的 Logger。

如果它创建一个新的 Logger,其日志级别将根据 LogManager 配置进行配置,还会配置 LogManager,并将日志输出发送到其 Handlers。它将在 LogManager 全局命名空间中注册。

语法

它将 Logger 名称作为参数解析。Logger 名称必须用点 (.) 分隔,并且应基于子系统的包名类名。例如,java.awt、java.net 等。

如果未指定 Logger 名称,它将返回一个合适的 Logger 并抛出 NullPointerException

示例

Java Logger 类

Java 提供了一个 Logger 类,该类属于 java.util.logging 包。它包含与日志记录相关的方法。

  • 它用于为特定的应用程序组件记录消息。
  • 每个 Logger 都会跟踪 Logger 命名空间中的父 Logger(最近的现有祖先)。
  • Logger 也有一个关联的级别。如果级别为 null,它将从其父 Logger 继承级别。
  • 它还有一个关联的 ResourceBundle 名称。它用于本地化日志消息。与日志级别一样,如果它没有自己的 ResourceBundle 名称,它将从其父级继承 ResourceBundle 名称。
  • 日志消息会转发给已注册的 Handler 对象。此外,Handler 会将消息转发到各种目的地,如文件、操作系统、日志和控制台等。
  • Logger 的所有方法都是多线程安全的。

Logger 类提供了用于日志记录的方法,这些方法分为以下五类:

  • 它提供了一组 log 方法。该方法接受日志级别、消息以及消息的一些可选参数。
  • 还有一组称为 logp 的方法。它与 log 方法相同,但还显式地接受类名和方法名。
  • 它提供了另一组称为 logrb(日志包括资源包)的方法。它与 logp 方法类似,但还显式地接受资源包名称,以本地化日志消息。
  • 该类还提供了一组用于跟踪方法入口的方法,称为 entering
  • 它还提供了用于跟踪方法入口的方法,例如,抛出异常的方法被归类为 throwing exceptions。同样,返回某些内容的方法被归类为 existing methods。
  • 还包含一组用于最简单方法的便捷方法。当程序员只想在指定级别记录字符串时使用它。这些方法接受一个消息字符串作为参数。

因此,我们可以得出结论,LogManager 执行实际的日志记录。LogManager 的实例通过 getLogger() 方法访问。全局 Logger 实例通过 Logger 类的静态字段 GLOBAL_LOGGER_NAME 检索。它提供了对 Logging 包的方便使用。

日志框架

我们还可以使用日志记录框架来简化日志记录的概念。以下是一些用于日志记录的流行日志记录框架:

  • Log4j:Apache Log4j 是一个开源的基于 Java 的日志记录实用程序。
  • SLF4J:它代表 Simple Logging Facade for Java (SLF4J)。它是多个日志记录框架(如 Log4j、Logback 和 java.util.logging)的抽象层。
  • Logback:它是一个开源项目,设计为 Log4j 版本 1 的后继者,在 Log4j 版本 2 发布之前。
  • tinylog (tinylog):它是一个轻量级开源的日志记录器。