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

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

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

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

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

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

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

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

  1. 使用例如

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

另请看维基百科 。

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

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