log4j 与 System.out.println - 记录器的优势?
Posted
技术标签:
【中文标题】log4j 与 System.out.println - 记录器的优势?【英文标题】:log4j vs. System.out.println - logger advantages? 【发布时间】:2011-02-13 05:24:18 【问题描述】:我第一次在项目中使用 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
我有两个关于此的问题:
-
根据我对使用此记录器的基本理解,如果在记录器上启用了调试模式,我应该可以轻松地选择编写带有时间戳的日志文件 - 而不是向控制台发送垃圾邮件?
为什么 System.out.println 更难测试?我搜索了***并找到了testing recipe。所以我想知道使用 log4j 真正获得了什么样的优势。
【问题讨论】:
记录器被严重高估了。System.out
和 System.err
为您提供 80% 的功能和 20% 的日志框架。
i.redd.it/wz7z31me2h581.jpg 2021 年:“老板感谢我编写了一个安全的应用程序(我已将 log4j 替换为 System.out.println)”
【参考方案1】:
使用例如
org.apache.log4j.BasicConfigurator.configure(new FileAppender(
new PatternLayout("%dISO8601 %-5p %t: %m%n"), // see e.g. http://en.wikipedia.org/wiki/Log4j#TTCC
"log/mainWhatever.log"));
使用logger.setLevel(...)
,您可以轻松选择是否显示logger.debug(..)
消息,例如将其设置为警告级别,并且不会打印任何跟踪、调试和信息语句。这样可以节省您只需要注释掉偶尔需要的调试语句的时间。
也可以看看Wikipedia。
【讨论】:
【参考方案2】:记录器能够定义所记录消息的不同重要性级别,并能够使用不同的接收器进行输出 - 控制台、文件等。
此外,在使用记录器时,仅启用或禁用某种类型的消息也很容易 - 例如,您不希望在生产中看到每条调试消息。
我不认为使用记录器在单元测试中提供任何显着优势,但我还是更喜欢它。在单元测试中,断言通常是我最关心的问题。
顺便说一句,你真的应该考虑使用像 Commons Logging 或 SLF4J 这样的东西作为日志框架外观 - 将你的代码绑定到特定的日志框架是不好的风格。如果您愿意,Common Logging 和 SLF4J 可以让您轻松切换日志框架。
【讨论】:
【参考方案3】:您打印到 System.out 的任何内容都将转到“标准输出”,虽然您可以将标准输出重定向到文件并进行比较,但您有什么,这是非常不灵活的。此外,如果您使用 System.out,则无法过滤标准输出...所有内容都将被打印。使用 log4j,您可以设置不同的日志记录级别,以便不打印低于某个严重性/重要性阈值的日志记录消息(例如,如果您将日志记录级别更改为 WARN,则将不再显示 DEBUG 和 INFO 消息)。
此外,log4j 允许逐个类控制日志记录,而 System.out 只能在整个应用程序的粒度上进行控制(如果重定向 System.out,则将其重定向到整个程序)。相比之下,log4j 中的每个 logger 都可以被赋予不同的 appender。此外,您可以为 log4j 记录器提供多个附加程序(例如,使其进入系统记录器并通过网络)。您甚至可以将 log4j 记录器附加到 StringBuilder,以便您可以轻松阅读所写的内容。虽然 System.out 可以重定向,但这种重定向往往是相当有限的; System.out 可以重定向到文件或管道(到另一个程序),但您不能将其重定向到 URL,例如;相比之下,创建一个使用 HTTP POST 传输日志消息的附加程序将非常容易。
【讨论】:
【参考方案4】:使用 logger.setLevel(...) 您可以轻松选择是否显示 logger.debug(..) 消息,例如将其设置为警告级别,并且不会打印任何跟踪、调试和信息语句。这样可以节省您只需要注释掉偶尔需要的调试语句的时间
【讨论】:
【参考方案5】:对于 log4j,它提供了一个中间件服务,您可以在其中管理 DEBUG、INFO、ERROR 等日志记录级别。您可以启用和禁用日志记录。但是对于 System.out.println(),您可以必须管理每件事。
【讨论】:
以上是关于log4j 与 System.out.println - 记录器的优势?的主要内容,如果未能解决你的问题,请参考以下文章