Java 中的记录器 - Java 日志记录示例
今天我们将研究 Java 中的 Logger。Java Logger 提供 Java 编程中的日志记录。
Java 中的记录器
Java Logging API 是在 1.4 中引入的,您可以使用 Java Logging API 来记录应用程序消息。在本 Java 日志教程中,我们将学习 Java Logger 的基本功能。我们还将研究不同日志级别、日志处理程序、格式化程序、过滤器、日志管理器和日志配置的 Java Logger 示例。
Java 记录器
java.util.logging.Logger
是用于在 Java 日志 API 中记录应用程序消息的类。我们可以用一行非常简单的代码创建 Java Logger:
Logger logger = Logger.getLogger(MyClass.class.getName());
Java 日志级别
java.util.logging.Level
定义了java日志的不同级别。java中有七种级别的日志。
- 严重(最高)
- 警告
- 信息
- 配置
- 美好的
- 更精细
- 最精致
还有另外两种日志记录级别,OFF将关闭所有日志记录,ALL将记录所有消息。我们可以使用以下代码设置记录器级别:
logger.setLevel(Level.FINE);
将为所有等于或高于记录器级别的级别生成日志。例如,如果将记录器级别设置为 INFO,则将为 INFO、WARNING 和 SEVERE 日志消息生成日志。
Java 日志处理程序
我们可以向 Java 记录器添加多个处理程序,每当我们记录任何消息时,每个处理程序都会对其进行相应的处理。Java Logging API 提供了两个默认处理程序。
- ConsoleHandler:此处理程序将所有日志消息写入控制台
- FileHandler:此处理程序将所有日志消息以 XML 格式写入文件。
我们也可以创建自己的自定义处理程序来执行特定任务。要创建自己的 Handler 类,我们需要扩展java.util.logging.Handler类或其任何子类,如 StreamHandler、SocketHandler 等。以下是自定义 java 日志处理程序的示例:
package com.journaldev.log;
import java.util.logging.LogRecord;
import java.util.logging.StreamHandler;
public class MyHandler extends StreamHandler {
@Override
public void publish(LogRecord record) {
//add own logic to publish
super.publish(record);
}
@Override
public void flush() {
super.flush();
}
@Override
public void close() throws SecurityException {
super.close();
}
}
Java 日志格式化程序
格式化程序用于格式化日志消息。Java 日志 API 中有两种可用的格式化程序。
- SimpleFormatter:此格式化程序生成包含基本信息的文本消息。ConsoleHandler 使用此格式化程序类将日志消息打印到控制台。
- XMLFormatter:此格式化程序为日志生成 XML 消息,FileHandler 使用 XMLFormatter 作为默认格式化程序。
我们可以通过扩展类来创建自己的自定义格式化程序类,java.util.logging.Formatter
并将其附加到任何处理程序。这是一个简单的自定义格式化程序类的示例。
package com.journaldev.log;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;
public class MyFormatter extends Formatter {
@Override
public String format(LogRecord record) {
return record.getThreadID()+"::"+record.getSourceClassName()+"::"
+record.getSourceMethodName()+"::"
+new Date(record.getMillis())+"::"
+record.getMessage()+"\n";
}
}
Java 中的记录器 - Java 日志管理器
java.util.logging.LogManager
是读取日志配置、创建和维护记录器实例的类。我们可以使用该类来设置我们自己的应用程序特定配置。
LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));
这是 Java Logging API 配置文件的示例。如果我们不指定任何配置,它将从 JRE Homelib/logging.properties
文件中读取。mylogging.properties
handlers= java.util.logging.ConsoleHandler
.level= FINE
# default file output is in user's home directory.
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
com.journaldev.files = SEVERE
这是一个简单的 Java 程序,展示了 Java 中 Logger 的用法。
package com.journaldev.log;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
public class LoggingExample {
static Logger logger = Logger.getLogger(LoggingExample.class.getName());
public static void main(String[] args) {
try {
LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));
} catch (SecurityException | IOException e1) {
e1.printStackTrace();
}
logger.setLevel(Level.FINE);
logger.addHandler(new ConsoleHandler());
//adding custom handler
logger.addHandler(new MyHandler());
try {
//FileHandler file name with max size and number of log files limit
Handler fileHandler = new FileHandler("/Users/pankaj/tmp/logger.log", 2000, 5);
fileHandler.setFormatter(new MyFormatter());
//setting custom filter for FileHandler
fileHandler.setFilter(new MyFilter());
logger.addHandler(fileHandler);
for(int i=0; i<1000; i++){
//logging messages
logger.log(Level.INFO, "Msg"+i);
}
logger.log(Level.CONFIG, "Config data");
} catch (SecurityException | IOException e) {
e.printStackTrace();
}
}
}
当您运行上述 java logger 示例程序时,您会注意到 CONFIG 日志没有打印在文件中,这是由于 MyFilter 类造成的。
package com.journaldev.log;
import java.util.logging.Filter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
public class MyFilter implements Filter {
@Override
public boolean isLoggable(LogRecord log) {
//don't log CONFIG logs in file
if(log.getLevel() == Level.CONFIG) return false;
return true;
}
}
输出格式也将与 MyFormatter 类定义的格式相同。
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg977
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg978
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg979
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg980
如果我们不向FileHandler添加我们自己的Formatter类,那么日志消息将会像这样打印。
<record>
<date>2012-12-14T17:03:13</date>
<millis>1355533393319</millis>
<sequence>996</sequence>
<logger>com.journaldev.log.LoggingExample</logger>
<level>INFO</level>
<class>com.journaldev.log.LoggingExample</class>
<method>main</method>
<thread>1</thread>
<message>Msg996</message>
</record>
控制台日志消息将采用以下格式:
Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg997
Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg998
Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg998
下图显示了最终的 Java Logger 示例项目。这就是 Java 中的 Logger 和 Java Logger 示例的全部内容。您可以从以下链接下载该项目。
下载 Java Logger 示例项目
参考:Java 日志 API