注意:我尚未尝试此答案;YMMV。
POSIX方法
freopen将更改与流关联的基础文件。如联机帮助页所述:“
freopen()函数的主要用途是更改与标准文本流(stderr,stdin或stdout)关联的文件”。
因此,您可以创建自己的JNI库,该库仅将流重定向到文件中。 但是 ,要完成这项工作有几个严重的障碍:
- 您需要确保Java程序本身不使用标准流,因为它们也会被重定向。一种解决方法是
System.out
在程序启动时将et 更改为其他名称。 - 第三方库可能会绕过标准文本流,而直接写入基础文件描述符。这不太可能,但有可能。我不记得freopen()只是更改了缓冲流使用的文件描述符,还是实际上重新打开了底层fd。
- 您仍然会有将对“文件”的更改连接到记录器的问题。
最后一点是迄今为止最大的一点:stdio写入操作系统级别的文件描述符。您将必须创建一些Java级代码来读取该描述符并写入日志。我首先想到的是,您必须使用命名管道,然后启动一个新的Java线程来读取该管道。但这不能移植到不同的操作系统,并且可以在程序的配置中管理管道名称。
假设这是一个服务器程序,并且本身不处理标准IO流,那么我认为最好的解决方案是使用控制台记录器配置Log4J,并将所有控制台输出重定向到一个文件。
或与编写该库的人员交谈,以使他们添加可配置的日志记录。



