Java通过日志记录过程,允许我们创建和捕获日志消息和文件。
在Java中,日志记录需要框架和API。Java的java.util.logging
包中有一个内置的日志框架。
我们还可以使用第三方框架,如Log4j、Logback等进行日志记录。
Java日志组件
下图展示了Java日志API(java.util.logging
)的核心组件和控制流程。

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 | 打开所有级别的日志记录(捕获所有内容) |
每个日志级别都有一个整数值,用于决定其严重性,但OFF
和ALL
这两个特殊日志级别除外。
记录消息
默认情况下,最上面的三个日志级别始终被记录。要设置不同的级别,我们可以使用以下代码
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日志记录的一些优点。
- 有助于监控程序流程
- 有助于捕获可能发生的任何错误
- 为问题诊断和调试提供支持
另请阅读