清晰的代码,清晰的日志:使用合适的工具

很多程序员看上去忘记了如何记录(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。你也不需要将其放到类路径下。

此条目发表在 Java技术 分类目录,贴了 标签。将固定链接加入收藏夹。

清晰的代码,清晰的日志:使用合适的工具》有 3 条评论

  1. Pingback 引用通告: 清晰的代码,清晰的日志:你所需要的日志级别 | Java视点

  2. Pingback 引用通告: 清晰的代码,清晰的日志:易读、易解析(10/10) | Java视点

  3. Aspen 说:

    A mnuite saved is a minute earned, and this saved hours!

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>