在本教程中,我们将借助示例学习Java日志记录及其各种组件。
Java允许我们通过日志记录过程来创建和捕获日志消息和文件。
在Java中,日志记录需要框架和API。Java在java.util.logging程序包中具有内置的日志记录框架。
我们还可以将第三方框架(如Log4j,Logback等)用于日志记录。
Java 日志组件
下图显示了Java Logging API(java.util.logging)的核心组件和指定流程。
1.Logger
Logger类提供了日志记录的方法。我们可以从Logger类中实例化对象并调用其方法以进行记录。
让我们举个实例。
Logger logger = Logger.getLogger("newLoggerName");
Logger类的getLogger()方法用于查找或创建新的Logger。 字符串参数定义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); // 示例 logger.setLevel(Level.FINE);
在本示例中,只有Level.FINE和它之上的级别被设置为日志记录。删除所有其他日志消息。
现在要记录一条日志消息,我们使用该log()方法。
logger.log(Level.LogLevel, "log message"); // 示例 logger.log(Level.INFO, "This is INFO log level message");
有一些用于记录所需级别的速记方法。
logger.info( "这是INFO日志级别的消息"); logger.warning( "这是WARNING日志级别的消息");
然后,已通过设置的日志级别的所有日志请求都将转发到LogRecord。
注意:如果一个日志记录器的级别被设置为null,那么它的级别将从其父继承,以此类推。
2.筛选器(Filter)
过滤器(如果存在)决定LogRecord是否转发该日志记录。顾名思义,它根据特定的标准过滤日志消息。
如果LogRecord通过指定的条件,则仅从记录器传递到日志处理程序,并从日志处理程序传递到外部系统。
// 设置filter logger.setFilter(filter); // 获取 filter Filter filter = logger.getFilter();
3.处理程序(输出源)
日志处理程序或附加程序将接收LogRecord并将其导出到各种目标。
Java SE提供了5个内置处理程序:
处理程序 | 使用 |
---|---|
StreamHandler | 写入OutputStream |
ConsoleHandler | 写入控制台 |
FileHandler | 写入文件 |
SocketHandler | 写入到远程TCP端口 |
MemoryHandler | 写入内存 |
处理程序可以将LogRecord传递到过滤器,以再次确定是否可以将其转发到外部系统。
要添加新的处理程序,我们使用以下代码:
logger.addHandler(handler); // 示例 Handler handler = new ConsoleHandler(); logger.addHandler(handler);
要删除处理程序,我们使用以下代码:
logger.removeHandler(handler); // 示例 Handler handler = new ConsoleHandler(); logger.addHandler(handler); logger.removeHandler(handler);
一个记录器可以有多个处理程序。要获取所有处理程序,我们使用以下代码:
Handler[] handlers = logger.getHandlers();
4.格式化程序(Formatter)
处理程序还可以使用Formatter将LogRecord对象格式化为字符串,然后再将其导出到外部系统。
Java SE具有两个内置的Formatter:
格式化程序 | 使用 |
---|---|
SimpleFormatter | 将LogRecord格式化为字符串 |
XMLFormatter | 将LogRecord格式化为XML格式 |
我们可以使用以下代码来格式化处理程序:
// 格式化成字符串形式 handler.setFormatter(new SimpleFormatter()); // 格式化成XML格式 handler.setFormatter(new XMLFormatter());
日志管理器
日志管理对象跟踪的全球记录的信息。它读取并维护日志记录配置和记录器实例。
日志管理器是单例,这意味着仅实例化了一个实例。
要获取日志管理器实例,我们使用以下代码:
LogManager manager = new LogManager();
日志的优点
这是使用Java 日志的一些优点。
帮助监控程序的流程
帮助捕获可能发生的任何错误
为问题诊断和调试提供支持