java.util.logging.Logger是JDK自带的日志工具类,从1.4版本开始就已经有了。由于log4j等开源的日志组件,这个Logger并没有太多展现机会。但在一些测试性的代码中,JDK自带的Logger比log4j等更方便。
创建Logger对象
要使用JDK的日志功能,首先要取得java.util.logging.Logger实例,这可以通过Logger类的两个静态getLogger()方法来取得:
static Logger getLogger(String name)
查找或创建一个logger。
static Logger getLogger(String name, String resourceBundleName)
为指定子系统查找或创建一个logger。
name是Logger的名称,当名称相同时候,同一个名称的Logger只创建一个。
Logger的日志级别
全部定义在java.util.logging.Level里面。
各级别按降序排列如下:
- SEVERE(最高值)
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST(最低值)
此外,还有一个级别 OFF,可用来关闭日志记录。
使用级别 ALL 启用所有消息的日志记录。
Logger默认的级别是INFO,比INFO更低的日志将不显示。
比如下面这段代码:
package com.peterwanghao.samples.java.utils.java;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LoggingDemo {
public static void main(String[] args){
Logger myLogger = Logger.getLogger("com.peterwanghao.LoggingDemo");
myLogger.log(Level.SEVERE, "严重信息");
myLogger.log(Level.WARNING, "警告信息");
myLogger.log(Level.INFO, "一般信息");
myLogger.log(Level.CONFIG, "设定方面的信息");
myLogger.log(Level.FINE, "细微的信息");
myLogger.log(Level.FINER, "更细微的信息");
myLogger.log(Level.FINEST, "最细微的信息");
}
}
它的执行结果如下,只看到3条日志信息:
Logger的默认级别定义是在jre安装目录的lib下面logging.properties文件中。
# 缺省的全局级别.
.level= INFO
# 控制台级别
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
如果将控制台级别设置为ALL:
java.util.logging.ConsoleHandler.level = ALL
同时降低创建的Logger实例级别则可以显示出想要的内容:
package com.peterwanghao.samples.java.utils.java;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LoggingDemo {
public static void main(String[] args){
Logger myLogger = Logger.getLogger("com.peterwanghao.LoggingDemo");
myLogger.setLevel(Level.ALL);//设置级别为ALL,显示全部日志
myLogger.log(Level.SEVERE, "严重信息");
myLogger.log(Level.WARNING, "警告信息");
myLogger.log(Level.INFO, "一般信息");
myLogger.log(Level.CONFIG, "设定方面的信息");
myLogger.log(Level.FINE, "细微的信息");
myLogger.log(Level.FINER, "更细微的信息");
myLogger.log(Level.FINEST, "最细微的信息");
}
}
执行结果如下:
输出媒介控制器Handler
如果不想修改系统配置文件logging.properties,可以自己创建ConsolerHandler,也就是将信息输出至控制台。在自建的ConsolerHandler中调整日志级别。
package com.peterwanghao.samples.java.utils.java;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LoggingDemo {
public static void main(String[] args){
Logger myLogger = Logger.getLogger("com.peterwanghao.LoggingDemo");
myLogger.setLevel(Level.ALL);
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.ALL);
myLogger.addHandler(consoleHandler);
myLogger.log(Level.SEVERE, "严重信息");
myLogger.log(Level.WARNING, "警告信息");
myLogger.log(Level.INFO, "一般信息");
myLogger.log(Level.CONFIG, "设定方面的信息");
myLogger.log(Level.FINE, "细微的信息");
myLogger.log(Level.FINER, "更细微的信息");
myLogger.log(Level.FINEST, "最细微的信息");
}
}
执行效果跟上面一样。
日志信息除了输出到控制台外,还可以写到日志文件里,使用java.util.logging.FileHandler 将信息输出到文件。
package com.peterwanghao.samples.java.utils.java;
import java.io.File;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LoggingDemo {
public static void main(String[] args){
Logger myLogger = Logger.getLogger("com.peterwanghao.LoggingDemo");
myLogger.setLevel(Level.ALL);
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.ALL);
myLogger.addHandler(consoleHandler);
FileHandler fileHandler = null;
try {
String filePath = "E:\\" + File.separator + "logs";
String logPath = "LoggingDemo.log";
File fi = new File(filePath);
if ((fi.exists()) && (fi.isDirectory())) {
logPath = filePath + File.separator + logPath;
} else if (!fi.exists()) {
try {
fi.mkdirs();
logPath = filePath + File.separator + logPath;
} catch (Exception localException) {
}
}
fileHandler = new FileHandler(logPath, true);//true表示日志内容在文件中追加
fileHandler.setLevel(Level.ALL);//级别为ALL,记录所有消息
myLogger.addHandler(fileHandler);
} catch (Throwable e) {
System.out.println("创建文件失败!" + e.getMessage());
}
myLogger.log(Level.SEVERE, "严重信息");
myLogger.log(Level.WARNING, "警告信息");
myLogger.log(Level.INFO, "一般信息");
myLogger.log(Level.CONFIG, "设定方面的信息");
myLogger.log(Level.FINE, "细微的信息");
myLogger.log(Level.FINER, "更细微的信息");
myLogger.log(Level.FINEST, "最细微的信息");
}
}
执行后会自动生成日志文件,内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
<date>2021-12-24T17:52:38</date>
<millis>1640339558986</millis>
<sequence>0</sequence>
<logger>com.peterwanghao.LoggingDemo</logger>
<level>SEVERE</level>
<class>com.peterwanghao.samples.java.utils.java.LoggingDemo</class>
<method>main</method>
<thread>1</thread>
<message>严重信息</message>
</record>
<record>
<date>2021-12-24T17:52:39</date>
<millis>1640339559068</millis>
<sequence>1</sequence>
<logger>com.peterwanghao.LoggingDemo</logger>
<level>WARNING</level>
<class>com.peterwanghao.samples.java.utils.java.LoggingDemo</class>
<method>main</method>
<thread>1</thread>
<message>警告信息</message>
</record>
<record>
<date>2021-12-24T17:52:39</date>
<millis>1640339559074</millis>
<sequence>2</sequence>
<logger>com.peterwanghao.LoggingDemo</logger>
<level>INFO</level>
<class>com.peterwanghao.samples.java.utils.java.LoggingDemo</class>
<method>main</method>
<thread>1</thread>
<message>一般信息</message>
</record>
<record>
<date>2021-12-24T17:52:39</date>
<millis>1640339559076</millis>
<sequence>3</sequence>
<logger>com.peterwanghao.LoggingDemo</logger>
<level>CONFIG</level>
<class>com.peterwanghao.samples.java.utils.java.LoggingDemo</class>
<method>main</method>
<thread>1</thread>
<message>设定方面的信息</message>
</record>
<record>
<date>2021-12-24T17:52:39</date>
<millis>1640339559078</millis>
<sequence>4</sequence>
<logger>com.peterwanghao.LoggingDemo</logger>
<level>FINE</level>
<class>com.peterwanghao.samples.java.utils.java.LoggingDemo</class>
<method>main</method>
<thread>1</thread>
<message>细微的信息</message>
</record>
<record>
<date>2021-12-24T17:52:39</date>
<millis>1640339559079</millis>
<sequence>5</sequence>
<logger>com.peterwanghao.LoggingDemo</logger>
<level>FINER</level>
<class>com.peterwanghao.samples.java.utils.java.LoggingDemo</class>
<method>main</method>
<thread>1</thread>
<message>更细微的信息</message>
</record>
<record>
<date>2021-12-24T17:52:39</date>
<millis>1640339559080</millis>
<sequence>6</sequence>
<logger>com.peterwanghao.LoggingDemo</logger>
<level>FINEST</level>
<class>com.peterwanghao.samples.java.utils.java.LoggingDemo</class>
<method>main</method>
<thread>1</thread>
<message>最细微的信息</message>
</record>
</log>
不同的处理器可以设置不同的日志级别,接收不同的日志信息。
自定义Formatter
Formatter可以为日志信息做格式化处理。Formatter接受LogRecord,并将它转换为一个特定格式字符串。
默认提供了两种Formatter:
1.java.util.logging.SimpleFormatter:标准日志格式。
2.java.util.logging.XMLFormatter:XML形式的日志格式。
从上一节的例子可知,FileHandler的默认格式是java.util.logging.XMLFormatter,而ConsolerHandler的默认格式是java.util.logging.SimpleFormatter。
可自己设计想要的日志格式:
package com.peterwanghao.samples.java.utils.java;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
public class LoggingDemo {
public static void main(String[] args){
Logger myLogger = Logger.getLogger("com.peterwanghao.LoggingDemo");
myLogger.setLevel(Level.ALL);
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.ALL);
myLogger.addHandler(consoleHandler);
FileHandler fileHandler = null;
try {
String filePath = "E:\\" + File.separator + "logs";
String logPath = "LoggingDemo.log";
File fi = new File(filePath);
if ((fi.exists()) && (fi.isDirectory())) {
logPath = filePath + File.separator + logPath;
} else if (!fi.exists()) {
try {
fi.mkdirs();
logPath = filePath + File.separator + logPath;
} catch (Exception localException) {
}
}
fileHandler = new FileHandler(logPath, true);//true表示日志内容在文件中追加
fileHandler.setLevel(Level.ALL);//级别为ALL,记录所有消息
fileHandler.setFormatter(new Formatter() {
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public String format(LogRecord record) {
StringBuilder sb = new StringBuilder();
String dataFormat = this.sdf.format(Long.valueOf(record.getMillis()));
sb.append(dataFormat).append(" ");
sb.append("level:").append(record.getLevel()).append(" ");
sb.append(record.getMessage()).append("\n");
return sb.toString();
}
});
myLogger.addHandler(fileHandler);
} catch (Throwable e) {
System.out.println("创建文件失败!" + e.getMessage());
}
myLogger.log(Level.SEVERE, "严重信息");
myLogger.log(Level.WARNING, "警告信息");
myLogger.log(Level.INFO, "一般信息");
myLogger.log(Level.CONFIG, "设定方面的信息");
myLogger.log(Level.FINE, "细微的信息");
myLogger.log(Level.FINER, "更细微的信息");
myLogger.log(Level.FINEST, "最细微的信息");
}
}
执行效果如下:
2021-12-24 18:13:44 level:SEVERE 严重信息
2021-12-24 18:13:44 level:WARNING 警告信息
2021-12-24 18:13:44 level:INFO 一般信息
2021-12-24 18:13:44 level:CONFIG 设定方面的信息
2021-12-24 18:13:44 level:FINE 细微的信息
2021-12-24 18:13:44 level:FINER 更细微的信息
2021-12-24 18:13:44 level:FINEST 最细微的信息