都 9102 了,你还不知道 System.out.println 的危害!

最近需要改一个老项目,项目代码非常的多,完全称得上是“大而全”。


老项目里面的代码,经过几代人的编写,非常难以读懂,而且出处是 System.out.println(),今天我抽个时间给大家说一说,为什么大多数人都被告知不要在 Java 应用中使用 System.out.println!


都 9102 了,你还不知道 System.out.println 的危害!

1、第一个原因就是它不能实现日志按等级输出。具体来说就是不能和日志框架一样,有 debug,info,error 等级别的控制。


2、它的输出,你不太容易从日志当中快速的跟踪到代码。包括它无法输出具体的类名,方法名,具体代码行数等。


3、第三个原因就是,它的性能太差。


都 9102 了,你还不知道 System.out.println 的危害!

你通过这个 synchronized 关键字,你就会发现,如果项目中大量的使用了 System.out.println,最终会导致整个代码调用成了“串行”输出。


有时候不是你的 JVM 没优化好,二是你写的代码就像再打草稿!


感兴趣的网友,可以针对 System.out.println 做一个压力测试,看看它的性能报告。


System.out.println 性能并不好。当我们深入分析时,其调用顺序如下 println - > print - > write()+ newLine()。所以,一些公司在 OpenJDK 的基础上就完全的把它禁用掉,或者换成其他的实现。


System.out.println VS 日志记录组件


这里以 Log4J 为例,Log4J 具有多种记录级别。如果我们正在编写一个小程序,只是为了实验/学习目的那么使用 System.out.println 就很不错。但当我们开发生产质量软件时,我们应该注意到应该使用记录组件(log4j等),并且应该避免使用 System.out.println。为什么?


  • 灵活性:log4j的记录器提供了多种记录级别。我们可以相应地分隔日志信息。例如,X消息只能在PRODUCTION上打印,Y消息应打印在ERROR等上。

  • 可重构性:log4j只需一个参数更改即可关闭所有日志记录。

  • 可维护性:想象一下,如果我们有数百个System.out.println全部通过应用程序散落,那么在一段时间内将难以维护程序。

  • 粒度:在应用程序中,每个类都可以有不同的记录器并相应地进行控制。

  • 实用性:在 System.out 中限制重定向消息的选项,但是如果是记录器(like log4j),则可以提供多种选项。我们甚至可以创建自定义输出选项并将其重定向。


所以我们不应该使用 System.out.println 进行日志记录和调试(logging and debugging)。


上一篇:都 9102 了,你还不知道 System.out.println 的危害!


下一篇:字典