Answers:
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必须跟上的String级联垃圾。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来匹配该行,这通常会使您获得比查看所需更多的输出。
.fine()
方法进行记录,但是我似乎无法显示消息...
有许多示例,也有不同类型的日志记录。看一下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");
}
}
Main.class.getSimpleName()
?这种重构工具可以在需要时适当地对其进行更改,但是它不如第二种解决方案那么笨拙。
与Apache Commons Logging(ACL)相比,SLF4J是更好的日志记录外观。它与其他日志记录框架建立了桥梁,可以通过SLF4J直接调用ACL,Log4J或Java Util日志记录,因此您可以根据需要将所有输出定向到一个日志文件,而只需一个日志配置文件。为什么您的应用程序将使用多个日志记录框架?因为您使用的第三方库(尤其是较旧的第三方库)可能会这样做。
SLF4J支持各种日志记录实现。它可以将所有内容输出到标准输出,使用Log4J或Logback(建议在Log4J上使用)。
我建议您使用Apache的commons日志记录实用程序。它具有高度的可扩展性,并为不同的记录器支持单独的日志文件。看这里。