原文: https://www.programiz.com/java-programming/logging

在本教程中,我们将借助示例学习 Java 日志记录及其各种组件。

Java 允许我们通过日志记录过程来创建和捕获日志消息和文件。

在 Java 中,日志记录需要框架和 API。 Java 在java.util.logging包中具有内置的日志记录框架。

我们还可以将第三方框架(例如 Log4j,Logback 等)用于记录目的。


Java 日志组件

下图表示 Java 日志记录 API(java.util.logging)的核心组件和控制流程。

Java 日志 - 图1

Java 日志

1.记录器

Logger类提供了记录方法。 我们可以从Logger类实例化对象并调用其方法以进行记录。

让我们举个例子。

  1. Logger logger = Logger.getLogger("newLoggerName");

Logger类的getLogger()方法用于查找或创建新的Logger。 字符串参数定义记录器的名称。

在这里,这将创建一个新的Logger对象或返回一个具有相同名称的现有Logger

约定使用class.getName()在当前类之后定义Logger

  1. Logger logger = Logger.getLogger(MyClass.class.getName());

注意:如果传递的名称为null,则此方法将抛出NullPointerException

每个Logger都有一个级别,该级别确定日志消息的重要性。 有 7 个基本日志级别:

日志级别(降序) 用途
SEVERE 严重失败
WARNING 警告消息,潜在问题
INFO 常规运行时信息
CONFIG 配置信息
FINE 常规开发人员信息(跟踪消息)
FINER 详细的开发人员信息(跟踪消息)
FINEST 高度详细的开发人员信息(跟踪消息)
OFF 关闭所有级别的日志记录(不捕获任何内容)
ALL 打开所有级别的日志记录(捕获所有内容)

除了两个特殊的日志级别OFFALL之外,每个日志级别都有一个确定其严重性的整数值。


记录消息

默认情况下,始终会记录前三个日志级别。 要设置其他级别,我们可以使用以下代码:

  1. logger.setLevel(Level.LogLevel);
  2. // example
  3. logger.setLevel(Level.FINE);

在此示例中,仅级别FINE及其之上的级别被设置为记录。 所有其他日志消息均被删除。

现在要记录一条消息,我们使用log()方法。

  1. logger.log(Level.LogLevel, "log message");
  2. // example
  3. logger.log(Level.INFO, "This is INFO log level message");

有一些用于记录所需级别的速记方法。

  1. logger.info( "This is INFO log level message");
  2. logger.warning( "This is WARNING log level message");

然后,已通过设置的日志级别的所有日志请求都将转发到LogRecord

注意:如果记录器的级别设置为null,则其级别将从其父级继承,依此类推。


2.筛选器

筛选器(如果存在)确定是否应转发LogRecord。 顾名思义,它会根据特定条件过滤日志消息。

LogRecord仅在通过指定条件时才从记录器传递到日志处理器,并从日志处理器传递到外部系统。

  1. // set a filter
  2. logger.setFilter(filter);
  3. // get a filter
  4. Filter filter = logger.getFilter();

3.处理器(附加器)

日志处理器或附加程序将接收LogRecord,并将其导出到各种目标。

Java SE 提供了 5 个内置处理器:

处理器 用途
StreamHandler 写入OutputStream
ConsoleHandler 写入控制台
FileHandler 写入文件
SocketHandler 写入远程 TCP 端口
MemoryHandler 写入内存

处理器可以将LogRecord传递给过滤器,以再次确定是否可以将其转发到外部系统。

要添加新的处理器,我们使用以下代码:

  1. logger.addHandler(handler);
  2. // example
  3. Handler handler = new ConsoleHandler();
  4. logger.addHandler(handler);

要删除处理器,我们使用以下代码:

  1. logger.removeHandler(handler);
  2. // example
  3. Handler handler = new ConsoleHandler();
  4. logger.addHandler(handler);
  5. logger.removeHandler(handler);

一个记录器可以有多个处理器。 要获取所有处理器,我们使用以下代码:

  1. Handler[] handlers = logger.getHandlers();

4.格式化器

处理器还可以使用格式化器LogRecord对象格式化为字符串,然后再将其导出到外部系统。

Java SE 具有两个内置的格式化器

格式化器 用途
SimpleFormatter LogRecord格式化为字符串
XMLFormatter LogRecord格式转换为 XML 格式

我们可以使用以下代码来格式化处理器:

  1. // formats to string form
  2. handler.setFormatter(new SimpleFormatter());
  3. // formats to XML form
  4. handler.setFormatter(new XMLFormatter());

日志管理器

LogManager对象跟踪全局日志记录信息。 它读取并维护日志记录配置和记录器实例。

日志管理器是单例,这意味着仅实例化了一个实例。

要获取日志管理器实例,我们使用以下代码:

  1. LogManager manager = new LogManager();

日志的优点

这是使用 Java 日志的一些优点。

  • 帮助监控程序的流程
  • 帮助捕获可能发生的任何错误
  • 为问题诊断和调试提供支持