我想在我的程序中使用日志。我听说过java.util.logging,但我不知道如何开始。
有什么例子可以说明我可以用日志做什么吗?我将如何在自己的程序中使用日志?
[java.util.logging
][1]使你不必在应用程序中多带一个jar文件,而且它与一个好的Formatter配合得很好。
一般来说,在每个类的顶部,你应该有。
private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );
然后,你可以使用[Logger][2]类的各种设施。
使用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) } );
使用参数化版本的日志设施,以免产生大量的String连缀垃圾,GC不得不跟上。
像上面的Object[]
很便宜,通常在堆栈分配上。
对于异常处理,一定要记录完整的异常细节。
try {
...something that can throw an ignorable exception
} catch( Exception ex ) {
LOGGER.log( Level.SEVERE, ex.toString(), ex );
}
我总是在这里传递ex.toString()
作为信息,因为这样当我"grep -n
"
for "Exception
"
日志文件中,我也可以看到消息。
否则,它就会在堆栈转储生成的下一行输出上,你必须有一个更高级的RegEx来匹配这一行,这往往会让你得到比你需要查看的更多的输出。
[1]: http://docs.oracle.com/javase/7/docs/api/java/util/logging/package-summary.html [2]: http://docs.oracle.com/javase/7/docs/api/java/util/logging/Logger.html
有很多例子,也有不同类型的日志。看一下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");
}
}
SLF4J是一个比Apache Commons Logging(ACL)更好的日志界面。它有连接其他日志框架的桥梁,使得对ACL、Log4J或Java Util Logging的直接调用通过SLF4J进行,因此,如果你愿意,只需一个日志配置文件,就可以将所有输出指向一个日志文件。为什么你的应用程序会使用多个日志框架?因为你使用的第三方库,特别是老的,可能会使用。
SLF4J支持各种日志实现。它可以把所有的东西都输出到standard-out,使用Log4J,或者Logback(推荐超过Log4J)。
我个人会用[minlog][1]。 它极其简单,因为日志类只有几百行代码。