log4j与System.out.println - 记录器的优势?

时间:2010-04-28 07:24:42

标签: java logging junit timestamp logfiles

我在项目中第一次使用log4j。一位程序员告诉我,使用System.out.println被认为是一种不好的风格,log4j就像现在的日志记录标准一样。

我们做了很多JUnit测试 - System.out事实证明更难测试。

因此我开始将log4j用于Console控制器类,这只是处理命令行参数。

// log4j logger config 
org.apache.log4j.BasicConfigurator.configure();
Logger logger = LoggerFactory.getLogger(Console.class);
Category cat = Category.getRoot(); 

似乎工作:

logger.debug("String");

产地:

1 [main] DEBUG project.prototype.controller.Console  - String

我对此有两个问题:

  1. 根据我的基本理解,如果在记录器上启用了调试模式,使用此记录器的基本理解应该为我提供了一个编写带时间戳的日志文件的舒适选项 - 而不是垃圾邮件控制台?
  2. 为什么System.out.println更难测试?我搜索了stackoverflow并找到了testing recipe。所以我想知道使用log4j我真正获得了什么样的优势。

5 个答案:

答案 0 :(得分:23)

记录器能够定义记录消息的不同重要级别以及为输出使用不同接收器的能力 - 控制台,文件等。

使用记录器时,也很容易启用或禁用某种类型的消息 - 例如,您不希望在生产中看到每个调试消息。

我认为使用记录器不会在单元测试中提供任何明显的优势,但我甚至更喜欢它。在单元测试中,断言通常是我主要关注的问题。

顺便说一下,您应该考虑使用Commons LoggingSLF4J之类的东西作为日志框架外观 - 将代码绑定到特定的日志框架是不好的方式。如果您选择,通用日志和SLF4J可以轻松切换日志框架。

答案 1 :(得分:8)

您打印到System.out的任何内容都将转到“标准输出”,虽然您可以将标准输出重定向到文件并进行比较,但是您有什么,这是非常不灵活的。此外,如果您使用System.out,则无法过滤标准输出的内容...将打印所有内容。使用log4j,您可以设置不同的日志记录级别,以便不打印低于特定严重性/重要性阈值的日志记录消息(例如,如果将日志记录级别更改为WARN,则不再显示DEBUG和INFO消息)。 / p>

此外,log4j允许在逐个类的基础上控制日志,而System.out只能以整个应用程序的粒度进行控制(如果重定向System.out,则将其重定向到整个程序)。相比之下,log4j中的每个记录器都可以被赋予不同的appender。此外,您可以为log4j记录器提供多个appender(例如,它可以通过系统记录器,也可以通过网络)。您甚至可以将一个log4j记录器附加到StringBuilder,以便您可以轻松读取所写的内容。虽然可以重定向System.out,但这种重定向往往相当有限; System.out可以重定向到文件或管道(到另一个程序),但是你无法将它重定向到URL,例如;相比之下,创建一个使用HTTP POST传输日志消息的appender非常容易。

答案 2 :(得分:2)

  1. 使用例如

    org.apache.log4j.BasicConfigurator.configure(new FileAppender(  
        new PatternLayout("%d{ISO8601} %-5p %t: %m%n"),  // see e.g. http://en.wikipedia.org/wiki/Log4j#TTCC  
        "log/mainWhatever.log"));
    
  2. 使用logger.setLevel(...),您可以轻松选择是否显示logger.debug(..)条消息,例如将其设置为级别警告,不会打印任何跟踪,调试和信息语句。这样可以节省您只需偶尔注释掉调试语句的时间。

  3. 另请查看Wikipedia

答案 3 :(得分:0)

使用logger.setLevel(...),您可以轻松选择是否显示logger.debug(..)消息,例如将其设置为级别警告,不会打印任何跟踪,调试和信息语句。这样可以节省您只需偶尔注释掉调试语句的时间

答案 4 :(得分:0)

对于log4j,它提供了一个中间件服务,您可以在其中管理日志级别,如DEBUG,INFO,ERROR等。您可以启用和禁用日志记录。但是对于System.out.println(),您可以必须管理每件事。