Java8基础知识(八)记录日志

记录日志

可以用记录日志代替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)

还可以调用enteringexiting来跟踪执行流:

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级别和以字符串ENTRYRETURN开始的日志记录。

可以使用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)

格式化器

使用ConsoleHandlerFileHandler可以生成文本和XML格式的日志记录,也可以扩展Formatter类覆盖format方法来自定义格式,通常会使用到以下方法:

// 对部分消息进行格式化、参数替换和本地化应用操作
String formatMessage(LogRecord record)
// 添加头部和尾部
String getHead(Handler h)
String getTail(Handler h)
// 最后调用setFormatter将格式化器安装到处理器中

猜你喜欢

转载自www.cnblogs.com/aries99c/p/12601324.html