26

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

我们做了很多 JUnit 测试——System.out结果证明东西更难测试。

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

// 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 并找到了一个测试配方。所以我想知道使用 log4j 真正获得了什么样的优势。
4

5 回答 5

26

记录器能够定义所记录消息的不同重要性级别,并能够使用不同的接收器进行输出 - 控制台、文件等。

此外,在使用记录器时,仅启用或禁用某种类型的消息也很容易——例如,您不想在生产中看到每条调试消息。

我不认为使用记录器在单元测试中提供任何显着优势,但我还是更喜欢它。在单元测试中,断言通常是我最关心的问题。

顺便说一句,你真的应该考虑使用像Commons LoggingSLF4J这样的东西作为日志框架外观——将你的代码绑定到特定的日志框架是不好的风格。如果您愿意,Common Logging 和 SLF4J 可以让您轻松切换日志框架。

于 2010-04-28T07:33:02.367 回答
9

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

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

于 2010-04-28T07:33:26.147 回答
3
  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(..)消息,例如将其设置为警告级别,并且不会打印任何跟踪、调试和信息语句。这可以节省您只需要注释掉偶尔需要的调试语句的时间。

也看看维基百科

于 2010-04-28T07:31:50.450 回答
0

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

于 2015-05-19T14:56:23.863 回答
0

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

于 2016-01-03T10:17:18.690 回答