繁体   English   中英

想让“System.out.println()”打印消息到 log4j

[英]Want to make “System.out.println()” to print message to log4j

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

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

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


您可以更改这些流 go 的位置,方法是使用System.setOutSystem.setErr将它们指向 log4j 日志文件。 然而:

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

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

  • 弄清楚每条“控制台日志消息”的结束位置可能会很棘手,特别是如果您希望将多行控制台 output 视为一个日志事件
  • 您将只有有限的 log4j 可配置性,因为所有“控制台日志消息”都将通过单个 Logger 进行 go (或者可能一个用于out一个用于err
  • 与正常的 log4j 日志记录相比,性能将是一个更大且更难处理的问题。

您应该能够调用System.setOut(new SomeCustomLog4JAdapter()); class SomeCustomLog4JAdapter extends PrintStream

是的。 Use java.lang.System.setOut(java.io.PrintStream) and java.lang.System.setErr(java.io.PrintStream) to replace standard out and error streams.

鉴于您的限制,将stdoutstderr重定向到文件是否足够?

File outFile  = new File("/var/log/jiang/stdout.log");
PrintStream outStream = new PrintStream(new FileOutputStream(outFile));
System.setOut(outStream);

File errFile  = new File("/var/log/jiang/stderr.log");
PrintStream errStream = new PrintStream(new FileOutputStream(errFile));
System.setErr(errStream);

根据其他人的回答,是的,可以使用System.setOut(...) 但我真的建议你不要。 您只是在为未来的开发人员制造一场噩梦,并没有真正节省任何时间或金钱。 现在就做这项工作以正确完成它,从长远来看它会得到回报。

除此之外,从 System.out 和 System.err 到 log4j 的路由文本(在我看来)是错误的,因为您将无法利用日志记录级别将调试与错误信息分开。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM