记录日志
可以用记录日志代替System.out.println
方法来进行调试。记录日志的优点如下:
- 可以根据级别取消日志。
- 可以禁止日志记录输出。
- 可以将日志记录定向到不同处理器。
- 可以对记录进行过滤。
- 可以采用不同的方式格式化日志记录。
- 可以使用多个日志记录器。
- 可以通过修改配置文件来设置日志记录。
基本日志
最简单的日志,可以使用全局日志记录器global logger调用info
方法来生成。
Looger.getGlobal().info("File->Open menu item selected");
调用setLevel
方法可以控制显示日志的级别。
// 取消所有的日志
Logger.getGlobal().serLevel(Level.OFF);
高级日志
当开发大型的应用程序时,需要使用多个日志记录器,调用getLogger
方法创建或获取记录器。
// 用静态变量存储日志记录器的引用,防止其被垃圾回收
private static final Logger myLogger = Logger.getLogger("com.mycompany.myapp");
日志记录分为七个等级(依次降低),默认只记录前三个级别:
SERVERE
WARNING
INFO
CONFIG
FINE
FINER
FINEST
默认的日志记录包含日志调用的类名和方法名。若虚拟机对执行过程进行了优化,就得不到准确的调用信息。此时可以调用logp
方法获得调用类和方法的确切位置。方法签名如下:
void logp(Level l, String className, String methodName, String message)
还可以调用entering
和exiting
来跟踪执行流:
int read(String file, String pattern) {
logger.entering("com.mycompany.mylib.Reader", "read",
new Object[] {file, pattern});
// ...
logger.exiting("com.mycompany.mylib.Reader", "read", count);
return count;
}
这些调用将生成FINER
级别和以字符串ENTRY
和RETURN
开始的日志记录。
可以使用throwing
方法和log
方法来提供日志记录中包含的异常描述内容,来记录不可预料的异常。
// 典型用法
if (condition) {
IOException exception = new IOException("message");
// throwing可以记录一条FINER级别的记录和一条以THROW开始的信息
logger.throwing("com.mycompany.mylib,Reader", "read", exception);
throw exception;
}
// try块用法
try {
// ...
}catch (IOException e) {
Logger.getlogger("com.mycompany.myapp").log(Level.WARNING, "Reading image", e);
}
修改日志管理器配置
配置文件存在于jre\lib\logging.properties
。
若要使用另一个配置文件,就要将java.util.logging.config.file
特性设置为配置文件的存储位置,并用命令java -Djava.util.logging.config.file=configFile MainClass
来启动程序。
可以通过修改配置文件中日志记录器的.level
来修改默认的日志记录级别,同时要修改处理器的.level
。
处理器
默认情况下,日志记录器将记录发送到ConsoleHandler
中,并由其输出到System.err
流中。
与日志记录器对应,处理器也有日志记录级别。一个日志记录的级别必须高于其记录器和处理器的阈值。
过滤器
默认情况下,过滤器根据日志记录的级别进行过滤,每个日志记录器的和处理器都可以有一个可选的过滤器来完成附加的过滤,使用setFilter
方法即可。还可以通过实现Filter
接口自定义过滤器。
boolean isLoggable(LogRecord record)
格式化器
使用ConsoleHandler
和FileHandler
可以生成文本和XML
格式的日志记录,也可以扩展Formatter
类覆盖format
方法来自定义格式,通常会使用到以下方法:
// 对部分消息进行格式化、参数替换和本地化应用操作
String formatMessage(LogRecord record)
// 添加头部和尾部
String getHead(Handler h)
String getTail(Handler h)
// 最后调用setFormatter将格式化器安装到处理器中