启动我的Java程序时,使用如下命令(unix)将标准输出和错误重定向到某些特定文件:
> 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 :(得分: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
答案 1 :(得分:0)
如果你的程序关心文件名,你应该提供输出和错误文件作为程序的参数,而不是重定向stdout和stderr。
毕竟,完全有可能你的程序可以在没有重定向输出的情况下运行 - 在这种情况下你想在哪里写这个额外的文件?
答案 2 :(得分:0)
你不能这样做,因为这是处理这个问题的UNIX shell。我所知道的UNIX工具没有能力做你的建议。
您应该使用日志框架或(较低级别)设置System.err和System.out将您的java程序本身重定向到FileOutputStream。然后,您可以使用参数指定此“stdout文件”,您可以在java程序中恢复该参数。
答案 3 :(得分:0)
不要使用stdout / srderr。
使用可配置的日志框架(jog4j,java.util.logging等)并配置file-appender。否则你可能会创建巨大的日志文件并且必须停止你的应用程序,如果你想删除它(如果它们被锁定)。