logger配置 - 使用java.util.logging的好例子




org.slf4j.logger使用 logger使用python (6)

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()作为消息,因为然后当我在日志文件中的“ Exception ”中“ grep -n ”时,我也可以看到消息。 否则,它将位于堆栈转储生成的下一行输出中,并且您必须具有更高级的RegEx才能与该行匹配,这往往会让您获得比您需要查看更多的输出。

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

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


我建议你使用Apache的公共日志记录工具。 它具有高度的可扩展性,并支持不同记录器的单独日志文件。 看到这里


有很多例子,也有不同类型的日志记录。 看看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");
  }
}

应该像这样声明记录器:

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

所以如果你重构你的课程名称如下。

在这里写了一篇关于java记录器的例子


我会亲自使用minlog 。 这非常简单,因为日志记录类是几百行代码。


以下是Java语言规范的官方文字。

14.20.2。 执行try-finally和try-catch-finally

通过首先执行try块来执行带有finally块的try语句。 然后有一个选择:

  • 如果try块的执行正常完成,[...]
  • 如果try块的执行由于值Vthrow而突然完成,
  • 如果try块的执行由于其他原因R而突然完成,则执行finally块。 然后有一个选择:
    • 如果finally块正常完成,则由于原因Rtry语句突然完成。
    • 如果由于S原因, finally块突然完成,那么try语句因S 原因突然完成( 并且原因R被丢弃 )。

return规范实际上使得这个明确:

JLS 14.17退货声明

ReturnStatement:
     return Expression(opt) ;

没有Expression return语句尝试将控制权转移给包含它的方法或构造函数的调用者。

带有Expression return语句尝试将控制转移给包含它的方法的调用者; Expression的值将成为方法调用的值。

前面的描述说“ 试图传输控制 ”而不是“ 传输控制 ”,因为如果在try块包含return语句的方法或构造函数中有任何try语句,那么这些try语句的任何finally子句将被执行,in在控制转移到方法或构造函数的调用者之前,从最内层到最外层。 突然完成finally子句可能会中断由return语句启动的控制权转移。





java logging java.util.logging