java - 想要使 "System.out.println()"将消息打印到 log4j

标签 java logging

我们的项目使用 System.out.println() 或 System.err.println() 来输出调试信息。现在我们想使用 log4j 将这些输出定向到日志文件,而不仅仅是控制台。为避免影响或风险,我们不想将所有“System.out.println()”替换为“logger.debug”,而只是想编写一些代码来使这些输出重定向到 log4j 日志文件,而不是每个类中的代码更改仍然使用 System.out.println()(我们知道这是不好的做法,但我们目前不想进行全局搜索和替换)。是否可以?谢谢。

最佳答案

我想这是可能的,尽管这绝对是个坏主意。您应该硬着头皮替换所有 System.out.printXXx()System.err.printXXx() 调用。

(您不必在一个大的更改中执行此操作,也不必使用自动搜索/替换来执行此操作……如果这些事情让您感到不舒服。)


您可以通过使用 System.setOutSystem.setErr 将它们指向 log4j 日志文件来更改这些流的去向。然而:

  • 您可能会遇到输出交错和/或日志文件截断的问题,具体取决于 log4j 附加程序的具体实现方式
  • 您不会获得 log4j 时间戳等
  • 您将无法通过 log4j 配置控制日志记录,因为您的重定向在 log4j 的背后进行
  • log4j 日志文件轮换无法正常工作

一个更复杂的替代方法是创建特殊的 OutputStream 对象来拦截输出并将其转换为对 log4j 记录器的调用。但这也会有问题:

  • 弄清楚每个“控制台日志消息”的结束位置可能很棘手,尤其是当您希望将多行控制台输出视为一个日志事件时
  • 您将只有有限的 log4j 可配置性,因为所有“控制台日志消息”都将通过一个 Logger(或者一个用于 out,一个用于 err)
  • 与普通的 log4j 日志记录相比,性能将是一个更大且更难处理的问题。

关于java - 想要使 "System.out.println()"将消息打印到 log4j,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6566960/

相关文章:

java - 字符串列表 VS 字符串数组 VS Stringbuilder

tomcat - log4j2.xml 被覆盖。如何阻止它?

haskell - 无法将 LoggingT 与 NoLoggingT 匹配

swift - Xcode App仅在设备上崩溃-EXC_CRASH(SIGABRT)

python - 如何抑制正在导入的模块的标准输出日志输出?

java - 使用私有(private)静态嵌套类实现Singleton

java - 在 Java 中将客户端连接到多个服务器

java - 手机上不存在表,但模拟器上一切正常

java - 通过java备份和恢复sql server数据库

django - Gunicorn Django 并将信息记录到文件中