可以通过Loger.getGlobal().info(xxxx);的方式来记录log。
11.5.2 高级日志
1)通过一个包名来 创建一个新的日志记录器。
private static final Logger logger = Logger.getLogger("my.learvjava.learnlog");
2)日志记录器也具有层次结构,且日志记录器的父子之间将共享某些属性,比如如果对com.mycompany设置了日志级别,那么其子记录器也会继承这个级别。
3)有以下7个日志记录器级别:
SEVER
WARNING
INFO
CONFIG
FINE
FINER
FINEST
默认值记录前三个级别。
可以使用Level.ALL来开启所有级别的记录,或者使用 Level.OFF来关闭所有级别的记录。
4)由于默认记录了info及其以上的级别,所以要使用 CONFIG, FINE, FINER, FINEST来记录那些有助于诊断,但是对程序员没有太大意义的调试信息。
5)void entering(xxx), void exiting(xxxx)将生成finer级别的日志信息。
6)可以用下面的方法来记录日志中包含的异常信息。
if(xxxx){
IOException e = new IOException("xxx);
logger.throwing("com.mycompany.mlib.Reader", 'read", e);
throw e;
}
调用throwing可以记录一条finner级别的记录和一条以THROW开始的信息。
11.5.3 修改日志管理配置
默认情况下位于e/lib/logging.properties文件内。
如果要修改,就需要在启动的时候通过如下命令来修改:
java -Djava.util.logging.config.file=configfile mainjavaclass
因为默认的日志信息是记录在java.util.logging.config.file这个静态变量中的。
在main方法中调用System.setProperties("java.util.logging.config.file", file)不会起作用,其原因是日志管理器在vm启动过程中被初始化,他会在main之前被执行。
可以通过在logging.properties中添加如下命令来设置日志记录级别
.level=FINE
11.5.4 本地化
虽然五年前我们在做我们应用程序的本地化的时候完全是靠自己想象的,但是现在回头来看,其实我们做的东西和java的本地化的思路是类似的,都是针对不同的语言提供不同的语言文件,通过key=value的文本文件的方式来提供。
java中稍微有点区别,他允许同时存在多种语言的语言文件,只是在名字中增加语言前缀,而我们是通过将语言文件放在语言文件夹中来决定的。
这也侧面说明了当编程进行到一定阶段之后,解决问题的思路是想通的。
11.5.5 处理器
与日志记录器一样,日志处理器也有日志记录级别。对于一个要被记录的日志,他的日志级别必须高于日志记录器和处理器的阈值。
日志管理器配置文件中记录的控制台处理器的日志级别为:
java.util.logging.ConsoleHandler.level=INFO
也可以绕过配置文件,不适用默认的处理器,而适用自定义的处理器:
Logger logger = Logger.getLogger("com.mycompany.myapp");
logger.setLevel(Level.FINE);
logger.setUseParantHanler(false);
Handler handler = new ConsoleHandler();
handler.setLevel(Level.FINE);
logger.addHandler(handler);
要想将日志发送到其他地方,就需要添加其他的处理器。java api为此提供了两个很有用的处理器:FileHandler, SocketHandler。
FileHandler fileHandler = new FileHandler();
logger.addHandler(fileHandler);
如果希望写更复杂的流处理器,就应该扩展Handler类,并自定义public/flush/close方法。
11.5.6 过滤器
只需要实现Filter接口的
boolean isLoggable(LogRecord record);
方法,就可以定义一个自己的过滤器。
记录器和处理器都可以设置过滤器,每个记录器和处理最多只能设置一个过滤器。
11.5.7 格式化器
实现Formatter接口,然后实现其中的 String format(LogRecord record)方法即可。
然后在通过调用处理器的setFormater(Fomater formater)方法来设置。