[英]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.