2012-01-06 36 views
0

當我的Java程序啓動時,標準輸出和犯錯被重定向到一些特定的文件,使用如下(UNIX)命令:如何獲取映射到標準out/err的文件?

> java org.company.MyClass 1>/path/to/some/file 2>/path/to/err/file 

有沒有辦法讀取從Java中此信息程序?我的要求是將文件寫入與標準輸出相同的目錄中。

unix腳本實際上是一個啓動java批處理程序的腳本。 Java程序本身使用log4j,但是登錄到控制檯,因此日誌最終被寫入這些文件。我無法在log4j配置文件中指定文件appender,因爲文件的路徑是由unix腳本決定的,而不是由Java程序決定的。理想情況下,unix腳本應該生成Java程序使用的log4j配置文件,但這非常複雜;這不是一種可能性。

+0

爲什麼不在發佈命令之前cd進入目標目錄? – fge 2012-01-06 10:47:47

回答

0

如果你的程序關心文件名,你應該提供輸出和錯誤文件作爲參數給程序,而不是重定向stdout和stderr。

畢竟,你的程序完全有可能運行沒有重定向輸出 - 在這種情況下,你想寫這個額外的文件?

+0

我甚至會說,最好是將System.out和System.err的用法全部刪除,並將其替換爲日誌框架的使用 – Robin 2012-01-06 10:50:59

+0

@Robin:這取決於輸出是什麼,但是,可能。這對於「我把其他文件放在哪裏」問題當然沒有幫助:) – 2012-01-06 10:56:55

1

這是不可能的,因爲你可以檢索的只是文件本身。您可以查找該文件,但通過硬鏈接,該文件可以出現在多個目錄中。如果你需要這個解決方案,我建議你做

java org.company.MyClass /path/to/some/file /path/to/err/file 

而且使用System.setOut還是System.setErr直接輸出到文件。這樣你也會知道他們的路徑。

另一種方法是做到這一點

java org.company.MyClass /path/to/some 1>/path/to/some/file 2>/path/to/err/f 
0

你不能做到這一點,因爲這是UNIX外殼誰對待這一點。我不知道誰有能力完成你所提議的UNIX工具。

您應該通過使用日誌框架或(更低級別)設置System.err和System.out來將輸出重定向到您的java程序本身,使其成爲FileOutputStream。然後你可以使用一個參數指定這個「標準輸出文件」,你可以在你的Java程序中恢復它。

0

請勿使用stdout/srderr。

使用可配置的日誌框架(jog4j,java.util.logging等)並配置文件appender。否則,如果你想刪除文件(如果它們被鎖定),你可能會創建巨大的日誌文件並且不得不停止你的應用程序。

相關問題