今天我们将深入了解Java中的日志记录器。Java日志记录器提供了Java编程中的日志记录。
Java中的日志记录器
Java日志记录 API是在1.4版本中引入的,您可以使用Java日志记录API来记录应用程序消息。在这个Java日志记录教程中,我们将学习Java日志记录器的基本功能。我们还将深入了解不同日志记录级别的Java日志记录示例、日志处理程序、格式化程序、过滤器、日志管理器和日志记录配置。
Java日志记录器
java.util.logging.Logger
是用于在Java日志记录API中记录应用程序消息的类。我们可以用非常简单的一行代码创建Java日志记录器;
Logger logger = Logger.getLogger(MyClass.class.getName());
Java日志记录级别
java.util.logging.Level
定义了 Java 日志的不同级别。Java 中有七个日志级别。
- SEVERE(最高)
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST
还有两个其他日志级别,OFF 会关闭所有日志记录,ALL 会记录所有消息。我们可以使用以下代码设置日志记录器级别:
logger.setLevel(Level.FINE);
日志将会生成对于等于或高于日志记录器级别的所有级别的消息。例如,如果日志记录器级别设置为 INFO,则将为 INFO、WARNING 和 SEVERE 的日志消息生成日志。
Java 日志处理器
我们可以向 Java 记录器添加多个处理器,每当我们记录任何消息时,每个处理器都会相应地处理它。Java 日志 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) {
// 添加自己的逻辑以发布
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
类来创建自己的自定义 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日志API配置文件的示例。如果我们不指定任何配置,它将从JRE主目录lib/logging.properties
文件中读取。mylogging.properties
handlers= java.util.logging.ConsoleHandler
.level= FINE
# 默认文件输出在用户的主目录。
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
# 限制打印到控制台的消息为INFO及以上级别。
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
com.journaldev.files = SEVERE
以下是一个展示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());
//添加自定义处理程序
logger.addHandler(new MyHandler());
try {
//FileHandler文件名以及日志文件最大大小和数量限制
Handler fileHandler = new FileHandler("/Users/pankaj/tmp/logger.log", 2000, 5);
fileHandler.setFormatter(new MyFormatter());
//为FileHandler设置自定义过滤器
fileHandler.setFilter(new MyFilter());
logger.addHandler(fileHandler);
for(int i=0; i<1000; i++){
//日志消息
logger.log(Level.INFO, "Msg"+i);
}
logger.log(Level.CONFIG, "Config data");
} catch (SecurityException | IOException e) {
e.printStackTrace();
}
}
}
当您运行以上Java日志示例程序时,您会注意到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) {
//不要在文件中记录CONFIG日志
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
如果我们不添加自己的Formatter类到FileHandler,日志消息将会像这样打印。
<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日志API
Source:
https://www.digitalocean.com/community/tutorials/logger-in-java-logging-example