接下来我们介绍的:java.util.logging.Logger是在JDK 1.4 版本之后加入的,提供了日志记录的API ,可以往控制台/文件中写日志了。
我们可以使用全局日志记录器来生成简单的日志记录
Logger.getGlobal().info("log test");
输出:
查找或创建一个 logger:
public static Logger getLogger(String name)
name是Logger的名称,当我们以此名称创建过则返回原来创建的那一个,否则创建新的。
Logger logger1 = Logger.getLogger("com.xiya.test.LogDemo");
Logger logger2 = Logger.getLogger("com.xiya.test.LogDemo");
System.out.println(logger1 == logger2);
返回true。
Logger的级别:
SEVERE | 严重 |
WARNING | 警告 |
INFO | 信息 |
CONFIG | 配置 |
FINE | 良好 |
FINER | 较好 |
FINEST | 最好 |
ALL | 开启所有级别日志记录 |
OFF | 关闭所有级别日志记录 |
logger默认的级别是INFO,比INFO更低的日志将不显示。
Logger的默认级别定义是在jre安装目录的lib下面的logging.properties。
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
Logger logger = Logger.getLogger("com.xiya.test.LogDemo");
logger.setLevel(Level.ALL);
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.FINEST);
logger.addHandler(consoleHandler);
logger.severe("严重");
logger.warning("警告");
logger.info("信息");
logger.config("配置");
logger.fine("良好");
logger.finer("较好");
logger.finest("最好");
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
严重: 严重
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
严重: 严重
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
警告: 警告
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
警告: 警告
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
信息: 信息
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
信息: 信息
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
配置: 配置
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
详细: 良好
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
较详细: 较好
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
非常详细: 最好
如上设置,我们可以显示所有级别的日志记录。我们看到严重、警告、信息都显示两次,这是由于logging.properties的原因。
简单的说:该文件定义了Logger默认的输出媒介控制器(Handler):java.util.logging.ConsolerHandler,也就是将信息输出至控制台。
我们也可以自定义logging.properties
测试:
import java.util.logging.*;
public class TestLogger {
public static void main(String[] args) {
Logger log = Logger.getLogger("com");
log.setLevel(Level.WARNING);
Logger log2 = Logger.getLogger("com.xiya");
log2.info("111");
log2.severe("222");
log2.warning("333");
}
}
输出:
四月 24, 2017 12:19:32 下午 TestLogger main
严重: 222
四月 24, 2017 12:19:32 下午 TestLogger main
警告: 333
Logger的Handler
java.util.logging.Handler
java.util.logging.MemoryHandler
java.util.logging.StreamHandler
java.util.logging.ConsoleHandler
java.util.logging.FileHandler
java.util.logging.SocketHandler
Handler 对象从 Logger 中获取日志信息,并将这些信息导出。例如,它可将这些信息写入控制台或文件中,也可以将这些信息发送到网络日志服务中,或将其转发到操作系统日志中。
可通过执行 setLevel(Level.OFF) 来禁用 Handler,并可通过执行适当级别的 setLevel 来重新启用。
Handler 类通常使用 LogManager 属性来设置 Handler 的 Filter、Formatter 和 Level 的默认值。
import java.util.logging.*;
import java.io.IOException;
public class TestLogger {
public static void main(String[] args) throws IOException {
Logger log = Logger.getLogger("com");
log.setLevel(Level.INFO);
Logger log1 = Logger.getLogger("com.xiya");
ConsoleHandler consoleHandler =new ConsoleHandler();
consoleHandler.setLevel(Level.ALL);
log.addHandler(consoleHandler);
FileHandler fileHandler = new FileHandler("testlog.log");
fileHandler.setLevel(Level.INFO);
//fileHandler.setFormatter(new SimpleFormatter());
log.addHandler(fileHandler);
log.info("111");
log1.info("222");
log1.fine("333");
}
}
输出:
四月 24, 2017 3:29:27 下午 TestLogger main
信息: 111
四月 24, 2017 3:29:27 下午 TestLogger main
信息: 111
四月 24, 2017 3:29:27 下午 TestLogger main
信息: 222
四月 24, 2017 3:29:27 下午 TestLogger main
信息: 222
testlog.log
<?xml version="1.0" encoding="GBK" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
<date>2017-04-24T15:30:23</date>
<millis>1493019023251</millis>
<sequence>0</sequence>
<logger>com</logger>
<level>INFO</level>
<class>TestLogger</class>
<method>main</method>
<thread>1</thread>
<message>111</message>
</record>
<record>
<date>2017-04-24T15:30:23</date>
<millis>1493019023297</millis>
<sequence>1</sequence>
<logger>com.xiya</logger>
<level>INFO</level>
<class>TestLogger</class>
<method>main</method>
<thread>1</thread>
<message>222</message>
</record>
</log>
可见,默认的日志方式是xml格式,很烂。所以最好自定义下logger的格式。需要用Formatter来定义。
Logger的Formatter
java.util.logging.Formatter
java.util.logging.SimpleFormatter
java.util.logging.XMLFormatter
Formatter 为格式化 LogRecords 提供支持。
一般来说,每个日志记录 Handler 都有关联的 Formatter。Formatter 接受 LogRecord,并将它转换为一个字符串。
以上默认设置即为:fileHandler.setFormatter(new XMLFormatter());
fileHandler.setFormatter(new SimpleFormatter());对应于:
四月 24, 2017 3:34:08 下午 TestLogger main
信息: 111
四月 24, 2017 3:34:08 下午 TestLogger main
信息: 222
当然我们可以自定义Formatter
package com.xiya.test;
import java.io.IOException;
import java.util.Date;
import java.util.logging.*;
/**
* Created by N3verL4nd on 2017/4/24.
*/
class LoggerFormatter extends Formatter {
@Override
public String format(LogRecord record) {
return "[" + new Date() + "]" + " [" + record.getLevel() + "] "
+ record.getClass() + record.getMessage() + "\n";
}
}
public class LogDemo {
public static void main(String[] args) throws IOException {
Logger logger = Logger.getLogger("com.xiya.test.LogDemo");
logger.setLevel(Level.ALL);
ConsoleHandler consoleHandler = new ConsoleHandler();
logger.addHandler(consoleHandler);
FileHandler fileHandler = new FileHandler("testLog.log");
fileHandler.setFormatter(new LoggerFormatter());
logger.addHandler(fileHandler);
logger.info("hi");
}
}