Java允许我们通过日志记录过程来创建和捕获日志消息和文件。
在Java中,日志记录需要框架和API。 Java在java.util.logging
包中具有内置的日志记录框架。
我们还可以将第三方框架(例如Log4j,Logback等)用于记录目的。
Java记录组件
下图显示了Java Logging API( java.util.logging
)的核心组件和控制流程。
1.记录仪
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个基本日志级别:
Log Level (in descending order) | Use |
---|---|
SEVERE | serious failure |
WARNING | warning message, a potential problem |
INFO | general runtime information |
CONFIG | configuration information |
FINE | general developer information (tracing messages) |
FINER | detailed developer information (tracing messages) |
FINEST | highly detailed developer information(tracing messages) |
OFF | turn off logging for all levels (capture nothing) |
ALL | turn on logging for all levels (capture everything) |
除了两个特殊的日志级别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.筛选器
筛选器(如果存在)确定是否应转发LogRecord 。顾名思义,它会根据特定条件过滤日志消息。
如果LogRecord通过指定的条件,则仅从记录器传递到日志处理程序,并从日志处理程序传递到外部系统。
// set a filter
logger.setFilter(filter);
// get a filter
Filter filter = logger.getFilter();
3.处理程序(Appenders)
日志处理程序或附加程序将接收LogRecord并将其导出到各种目标。
Java SE提供了5个内置处理程序:
Handlers | Use |
---|---|
StreamHandler |
writes to an OutputStream |
ConsoleHandler |
writes to console |
FileHandler |
writes to file |
SocketHandler |
writes to remote TCP ports |
MemoryHandler |
writes to memory |
处理程序可以将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.格式化程序
处理程序还可以使用Formatter将LogRecord对象格式化为字符串,然后再将其导出到外部系统。
Java SE具有两个内置的Formatter :
Formatters | Use |
---|---|
SimpleFormatter |
formats LogRecord to string |
XMLFormatter |
formats LogRecord to XML form |
我们可以使用以下代码来格式化处理程序:
// formats to string form
handler.setFormatter(new SimpleFormatter());
// formats to XML form
handler.setFormatter(new XMLFormatter());
日志管理器
LogManager对象跟踪全局日志记录信息。它读取并维护日志记录配置和记录器实例。
日志管理器是单例,这意味着仅实例化了一个实例。
要获取日志管理器实例,我们使用以下代码:
LogManager manager = new LogManager();
记录的优点
这是使用Java登录的一些优点。
- 帮助监控程序的流程
- 帮助捕获可能发生的任何错误
- 为问题诊断和调试提供支持