289

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

有没有我可以用日志记录做什么的例子?我将如何在我自己的程序中使用登录?

4

3 回答 3

359

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

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

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 来匹配该行,这通常会为您提供比您需要查看的更多的输出。

于 2013-05-08T19:11:45.823 回答
71

应该像这样声明记录器:

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

所以如果你重构你的类名,它会遵循。

我在这里写了一篇关于 java logger 的文章,并附有示例

于 2012-10-30T06:08:11.800 回答
55

有许多示例,也有不同类型的日志记录。看看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");
  }
}
于 2011-05-10T13:14:39.393 回答