簡體   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