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
”时,我也可以看到该消息。否则,它将出现在堆栈转储生成的下一行输出中,并且您还必须有一个更高级的正则表达式来匹配该行,这通常会为您提供比您需要查看的更多的输出。
应该像这样声明记录器:
private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());
所以如果你重构你的类名,它就会随之而来。
我写了一篇关于java记录器的文章,其中有示例。
有很多示例,也有不同类型的日志记录。看一下 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");
}
}