首先看代码, 定义一个 LogUtil 用来返回一个自定义的log
class LogUtil {
public static Logger getLogger() {
System.setProperty("java.util.logging.config.file", "mylog.properties");
Logger log = Logger.getLogger("myLogger");
log.setLevel(Level.ALL);
return log;
}
}
java.util.logging.config.file
当然,也可在命令行指定这个属性 java -Djava.util.logging.config.file mylog.properties XXXClass
mylog.properties 配置内容如下:
myLogger.handlers= java.util.logging.ConsoleHandler, java.util.logging.FileHandler
myLogger.level= ALL
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=[%1$tc][%2$s]: %4$s: %5$s%6$s%n
java.util.logging.FileHandler.pattern = C:\\Users\\myname\\myworkspace\\Demo\\mylog-%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.level = FINE
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
myLogger.handlers= java.util.logging.ConsoleHandler, java.util.logging.FileHandler
myLogger.level= ALL
ConsoleHandler 是把log输出到 控制台,FileHandler 是把log输出到文件。
每个Handler又可以定义自己的 level。log level的基本如下:
SEVERE (highest value)
WARNING
INFO
CONFIG
FINE
FINER
FINEST (lowest value)
另外还有两个值, Level.OFF 和 Level.ALL
myLogger.level 是总开关,如果myLogger.level设置为 OFF, 它handler无论设置什么值,都不会有输出。 如果myLogger.level设置为 FINE, 只有FINE 以上的log才会输出,即使Handler 把Level是指为ALL。
上面配置中,ConsoleHandler 使用了单行文本输出,FileHandler 使用了XML作为输出。
在ConsoleHandler 中, log输出采用 java.util.logging.SimpleFormatter 类格式化,实际是是调用如下方法格式化的。
String.format
(format, date, source, logger, level, message, thrown);
格式化表达式中:
%1$ 代表 date,%2$ 代表 source, 以此类推,每一个%n$ 分别代表 String.format(....) 的一个参数。
例如:
java.util.logging.SimpleFormatter.format=[%1$tc][%2$s]: %4$s: %5$s%6$s%n
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: Info: Hellow World!
java.util.logging.FileHandler.pattern = C:\\Users\\myname\\myworkspace\\Demo\\mylog-%u.log
"/" the local pathname separator
"%t" the system temporary directory
"%h" the value of the "user.home" system property
"%g" the generation number to distinguish rotated logs
"%u" a unique number to resolve conflicts
"%%" translates to a single percent sign "%"
现在来看客户端如何使用我们自定义的Logger, 代码如下:
public class LogDemo {
public static void main(String[] args) {
Logger log1 = LogUtil.getLogger();
Logger log2 = LogUtil.getLogger();
System.out.println(log1 == log2 ? "log1 = log2" : "log1 != log2");
LogDemo.testLog(log1);
}
private static void testLog(Logger log) {
System.out.println("Log:" + log.getName());
log.info("Info: Hellow World!");
log.warning("warning: Hellow World!");
log.info("logname = " + log.getName());
log.info("handlers = " + log.getHandlers().length);
for (Handler h : log.getHandlers()) {
log.info(h.getClass() + " " + h.getLevel());
}
log.fine("Log Fine");
}
}
运行后输出:
log1 = log2
Log:myLogger
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: Info: Hellow World!
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: WARNING: warning: Hellow World!
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: logname = myLogger
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: handlers = 2
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: class java.util.logging.ConsoleHandler ALL
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: class java.util.logging.FileHandler FINE
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: FINE: Log Fine
在我们的客户端程序中, 连续调用了两次 getLogger()
Logger log1 = LogUtil.getLogger();
Logger log2 = LogUtil.getLogger();
从输出可以看出,它们返回的是同一个对象
log1 = log2
所以对于名字为“myLogger” 这个logger实例, 它是一个单例。虚拟机只会创建一个名字为 “myLogger”的logger 对象。
下面是 FileHandler 输出到文件中的内容
C:\Users\myname\myworkspace\Demo\mylog-0.log
2016-05-31T17:56:09
1464688569941
0
myLogger
INFO
log.LogDemo
testLog
1
Info: Hellow World!
2016-05-31T17:56:09
1464688569943
1
myLogger
WARNING
log.LogDemo
testLog
1
warning: Hellow World!
2016-05-31T17:56:09
1464688569943
2
myLogger
INFO
log.LogDemo
testLog
1
logname = myLogger
2016-05-31T17:56:09
1464688569944
3
myLogger
INFO
log.LogDemo
testLog
1
handlers = 2
2016-05-31T17:56:09
1464688569944
4
myLogger
INFO
log.LogDemo
testLog
1
class java.util.logging.ConsoleHandler ALL
2016-05-31T17:56:09
1464688569945
5
myLogger
INFO
log.LogDemo
testLog
1
class java.util.logging.FileHandler FINE
2016-05-31T17:56:09
1464688569946
6
myLogger
FINE
log.LogDemo
testLog
1
Log Fine