使用java.util.logging的好例子

Ren*_*ani 266 java logging java.util.logging

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

是否有任何关于日志记录的例子?我如何在自己的程序中使用日志记录?

小智 326

java.util.logging 使您不必再使用您的应用程序再添加一个jar文件,并且它适用于良好的Formatter.

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

private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );
Run Code Online (Sandbox Code Playgroud)

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


使用Level.FINE任何东西是调试在执行流程的最高级别:

LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );
Run Code Online (Sandbox Code Playgroud)

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

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

使用日志工具的参数化版本来防止GC必须跟上大量的字符串连接垃圾.Object[]如上所述便宜,通常在堆栈分配上.


通过异常处理,始终记录完整的异常详细信息:

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

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

  • 有趣的是,没有人提到过哪里可以找到日志文件. (28认同)
  • 我从1998年开始使用Java进行编程.我总是发现使用Java进行日志记录比需要的更令人头痛.这是迄今为止我读过的关于如何登录Java的最直接的解释.简洁也是. (7认同)
  • 你如何查看日志?我正在使用的库初始化Logger对象并使用`.fine()`方法进行记录,但我似乎无法显示消息... (5认同)
  • 如果您想知道日志的位置,请确保为记录器设置了处理程序.要简单地将日志输出到控制台,请使用新的ConsoleHandler,并使用addHandler方法将其添加到记录器.确保在记录器和处理程序上调用setLevel. (4认同)
  • 这是否写入某种文件.我无法在我的程序中使用它.我有你的初始线,但到目前为止还没有任何工作. (3认同)

han*_*noo 66

应该像这样声明记录器:

private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());
Run Code Online (Sandbox Code Playgroud)

因此,如果您重构您的类名,则遵循.

在这里写了一篇关于java logger的文章.


Ank*_*kit 50

有许多示例,也有不同类型的日志记录.看一下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");
  }
}
Run Code Online (Sandbox Code Playgroud)

没有硬编码类名:

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");
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么不将日志名称设置为`Main.class.getSimpleName()`?这种方式重构工具将在需要时正确地改变它,但它并不像你的第二个解决方案那样笨重. (14认同)
  • -1表示堆栈跟踪业务.它很慢并且可能会阻止编译器优化. (9认同)
  • 在初始化记录器时,为什么"慢度"根本不重要?提到缓慢是大多数人所谓的过早优化(是的,代码确实看起来有点hackish). (4认同)
  • 为记录器名称执行堆栈跟踪是hack,slow和unorthodox.它也会破坏并为您提供AOP代理或其他字节编码非凡的奇怪名称. (3认同)
  • @AndrewMcKinlay在什么情况下会破坏什么?如果logger标签应该与类名相同,那么这样做似乎完全没问题.重构工具会自动重命名,而如果它是一个硬编码的字符串,重构工具可能会跳过它或说"你还要重命名吗?". (3认同)

bco*_*ody 22

SLF4J是比Apache Commons Logging(ACL)更好的日志记录.它具有与其他日志框架的桥梁,直接调用ACL,Log4J或Java Util Logging通过SLF4J,因此您可以根据需要将所有输出定向到一个日志文件,只需一个日志配置文件.为什么您的应用程序使用多个日志记录框架?因为您使用的第三方库,特别是较旧的库,可能会这样做.

SLF4J支持各种日志记录实现.它可以将所有内容输出到标准输出,使用Log4J或Logback(推荐使用Log4J).

http://www.slf4j.org/

http://logback.qos.ch/


Chr*_*ett 9

我亲自使用minlog.它非常简单,因为日志类是几百行代码.

  • 对于最小的占用空间,这是可供选择的库. (3认同)