很多程序员看上去忘记了如何记录(logging)应用的行为和它当前的活动是非常重要的。当一些人在代码的很多地方这些写时:
log.info("!@#$%");
他可能没有意识到在维护、调优和发生错误时,应用日志的重要性。低估好的日志的价值是非常可怕的错误。我收集了我认为在编写日志时非常有用的技巧,我将在系列文章中给大家讲解。 第一个技巧(共10个)是关于日志记录库和相关工具。
在我看来SLF4J是目前最好的日志API,主要是因为它支持如下的记录模式:
log.debug("Found {} records matching filter: '{}'", records, filter);
在Log4J中,你需要这样使用:
log.debug("Found " + records + " records matching filter: '" + filter + "'");
这不仅非常长并且不易读,而且因为使用了字符串连接所以也很低效。SLF4J增加了非常好的 {} 特性。同时,因为字符串连接被避免了并且如果记录语句被过滤后,toString()方法也不会被调用,因此没有必要再使用isDebugEnable()。另外,你主要导在过滤器字符串参数上的单引号了吗?
SLF4J仅仅是一个门面(facade),作为实现我推荐Logback而不是Log4J。它有很多有趣的特性,并且与log4j相反,处于快速的开发中。
最后推荐的工具是Perf4J。下面是他们的箴言:
Perf4J is to System.currentTimeMillis() as log4j is to System.out.println()
我向我的一个负载很重的应用添加过Perf4J然后观察它的行为。管理员和用户都对该产品的良好性能的印象极好。Perf4J有他们自己的文档,现在你可以看看他们的开发指南。
作为总结,下面是一个pom文件:
<repositories>
<repository>
<id>Version99</id>
<name>Version 99 Does Not Exist Maven repository</name>
<layout>default</layout>
<url>http://no-commons-logging.zapto.org/mvn2</url>
</repository>
</repositories>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.11</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>0.9.20</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.5.11</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.5.11</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.5.11</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>99.0-does-not-exist</version>
</dependency>
要进行测试,使用如下代码:
SLF4JBridgeHandler.install();
org.apache.log4j.Logger.getLogger("A").info("Log4J");
java.util.logging.Logger.getLogger("B").info("java.util.logging");
org.apache.commons.logging.LogFactory.getLog("C").info("commons-logging");
org.slf4j.LoggerFactory.getLogger("D").info("Logback via SLF4J");
可以看到,无论使用哪个日志框架(我们的类路径上甚至没有Log4J和Commons-Logging,观察99.0-does-not-exist版本),每个日志语句都使用Logback框架进行输出。 因此,及时你最喜欢的框架依赖于Commons-logging甚至更糟糕的依赖于log4j。你也不需要将其放到类路径下。
Pingback 引用通告: 清晰的代码,清晰的日志:你所需要的日志级别 | Java视点
Pingback 引用通告: 清晰的代码,清晰的日志:易读、易解析(10/10) | Java视点
A mnuite saved is a minute earned, and this saved hours!