使用 java.util.logging 的好例子



我想在我的程序中使用日志。我听说过java.util.logging,但我不知道如何开始。

是否有任何示例说明我可以使用日志记录做什么?如何在自己的程序中使用日志记录?

java.util.logging使你不必在你的应用程序中多携带一个jar文件,并且它与一个好的格式化程序配合得很好。

一般来说,在每个班级的顶部,你应该有:

private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );

然后,您可以使用 Logger 类的各种工具。


Level.FINE 用于在执行流的顶层进行调试的任何内容:

LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );

在循环内部以及在调试基本流问题时可能并不总是需要查看那么多细节的地方使用 Level.FINER/Level.FINEST

LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );

使用日志记录工具的参数化版本来防止生成 GC 必须跟上的大量字符串级联垃圾。 如上所述Object[]很便宜,通常在堆栈分配上。


使用异常处理时,请始终记录完整的异常详细信息:

try {
    ...something that can throw an ignorable exception
} catch( Exception ex ) {
    LOGGER.log( Level.SEVERE, ex.toString(), ex );
}

我总是在这里传递ex.toString()作为消息,因为当我在日志文件中"grep -n"Exception"时,我也可以看到该消息。否则,它将位于堆栈转储生成的下一行输出上,并且您还必须具有更高级的 RegEx 来匹配该行,这通常会为您提供比您需要查看的更多的输出。

应该像这样声明记录器:

private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());

因此,如果您重构类名,它将遵循。

我写了一篇关于java记录器的文章,在这里有例子。

有许多日志记录示例以及不同类型的日志记录。看看java.util.logging包。

示例代码:

import java.util.logging.Logger;
public class Main {
  private static Logger LOGGER = Logger.getLogger("InfoLogging");
  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

不对类名进行硬编码:

import java.util.logging.Logger;
public class Main {
  private static final Logger LOGGER = Logger.getLogger(
    Thread.currentThread().getStackTrace()[0].getClassName() );
  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

最新更新