[英]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.setOut
和System.setErr
将它们指向 log4j 日志文件。 然而:
更复杂的替代方法是创建特殊的 OutputStream object 来拦截 output 并将其转换为对 log4j 记录器的调用。 但这也会有问题:
out
一个用于err
) 您应该能够调用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.
鉴于您的限制,将stdout
和stderr
重定向到文件是否足够?
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.