📜  Java记录

📅  最后修改于: 2020-09-26 15:03:58             🧑  作者: Mango

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

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

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

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


Java记录组件

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

The flow of control of Java Logging API
Java记录

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)

除了两个特殊的日志级别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.筛选器

筛选器(如果存在)确定是否应转发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.格式化程序

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

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登录的一些优点。

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