Java 日志

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

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

我们还可以使用第三方框架,如Log4j、Logback等进行日志记录。


Java日志组件

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

The flow of control of Java Logging API
Java 日志

1. Logger

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

让我们举个例子。

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

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

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

按照惯例,应该使用class.getName()在当前类之后定义一个Logger

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

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

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

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

每个日志级别都有一个整数值,用于决定其严重性,但OFFALL这两个特殊日志级别除外。


记录消息

默认情况下,最上面的三个日志级别始终被记录。要设置不同的级别,我们可以使用以下代码

logger.setLevel(Level.LogLevel);

// example
logger.setLevel(Level.FINE);

在此示例中,只记录FINE级别及以上级别的消息。所有其他日志消息都将被丢弃。

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

logger.log(Level.LogLevel, "log message");

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

有用于在所需级别记录的简写方法。

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

所有通过了已设定日志级别的日志请求随后会被转发到LogRecord

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


2. Filters

过滤器(如果存在)决定了LogRecord是否应该被转发。顾名思义,它根据特定标准过滤日志消息。

只有当LogRecord通过了指定的标准时,它才会被从日志记录器传递到日志处理程序,并从日志处理程序传递到外部系统。

// set a filter
logger.setFilter(filter);

// get a filter
Filter filter = logger.getFilter();

3. Handlers(Appenders)

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

Java SE提供了5种内置处理程序

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

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

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

logger.addHandler(handler);

// example
Handler handler = new ConsoleHandler();
logger.addHandler(handler);

要删除处理程序,我们使用以下代码

logger.removeHandler(handler);

// example
Handler handler = new ConsoleHandler();
logger.addHandler(handler);
logger.removeHandler(handler);

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

Handler[] handlers = logger.getHandlers();

4. Formatters

处理程序还可以使用Formatter在将LogRecord对象导出到外部系统之前,将其格式化为字符串。

Java SE有两个内置Formatters

Formatters 用途
SimpleFormatter LogRecord格式化为字符串
XMLFormatter LogRecord格式化为XML格式

我们可以使用以下代码来格式化处理程序

// formats to string form
handler.setFormatter(new SimpleFormatter());

// formats to XML form
handler.setFormatter(new XMLFormatter());

LogManager

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

日志管理器是一个单例,这意味着它只有一个实例。

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

LogManager manager = new LogManager();

日志记录的优点

以下是Java日志记录的一些优点。

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

另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战