想让"System.out.println()"将消息打印到log4j

Eri*_*ang 3 java logging

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

Ste*_*n C 7

我想这是可能的,虽然这绝对是一个坏主意.你应该咬紧牙关并更换所有System.out.printXXx()System.err.printXXx()电话.

(您不必在一次重大变更中执行此操作,并且您不必使用自动搜索/替换来执行此操作...如果这些事情让您感到不舒服.)


您可以更改这些流去使用System.setOut,并System.setErr以使它们指向一个log4j的日志文件.然而:

  • 您可能会遇到输出和/或日志文件截断的交错问题,具体取决于log4j appender的确切实现方式
  • 你不会得到log4j时间戳等
  • 您将无法通过log4j配置来控制日志记录,因为您的重定向位于log4j的后面
  • log4j日志文件轮换将无法正常工作

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

  • 确定每个"控制台日志消息"结束的位置可能很棘手,特别是如果您希望将多行控制台输出视为一个日志事件
  • 你只有有限的log4j可配置性,因为所有"控制台日志消息"都将通过一个Logger(或者一个用于out和一个用于err)
  • 与普通的log4j日志记录相比,性能将是一个更大,更易处理的问题.