2012-01-06 35 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。否则,如果你想删除文件(如果它们被锁定),你可能会创建巨大的日志文件并且不得不停止你的应用程序。

相关问题