gpt4 book ai didi

java - 通过 log4j 发送 JNI C stderr/stdout

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:30:55 25 4
gpt4 key购买 nike

我的 java 应用程序使用 JNI 调用用 C 编写的库。这个 native 库将错误记录到 stderr,但我想通过我的 log4j 记录器以某种方式重定向错误流。这可能吗?

C 库是外部的 - 我没有源代码,所以无法更改它。

谢谢

最佳答案

注意:我没有尝试过这个答案; YMMV.

POSIX 方法 freopen 将更改与流关联的基础文件。正如联机帮助页所述:“freopen() 函数的主要用途是更改与标准文本流(stderr、stdin 或 stdout)关联的文件”。

因此,您可以创建自己的 JNI 库,它只需将流重定向到一个文件中。 但是,要使这项工作有几个严重的障碍:

  1. 您需要确保您的 Java程序本身不使用标准流,因为它们会也重定向了。解决方法这是为了改变 System.out 等当你的程序启动时。
  2. 有可能第三方库绕过标准文本流,并直接写入底层文件描述符。它是不太可能但可能。我不能记住 freopen() 是否只是更改使用的文件描述符缓冲流,或者实际上重新打开底层 fd。
  3. 你会仍然有连接问题将"file"更改为记录器。

最后一点是迄今为止最大的一点:stdio 写入操作系统级文件描述符。您将不得不创建一些 Java 级代码来读取该描述符并写入日志。我的第一个想法是您必须使用命名管道,然后启动一个新的 Java 线程来读取该管道。但这不能移植到不同的操作系统,并且您会在程序配置中管理管道名称。

假设这是一个服务器程序,并且它本身不处理标准 IO 流,我认为您最好的解决方案是使用控制台记录器配置 Log4J,并简单地将所有控制台输出重定向到一个文件。

或者与编写库的人交谈,让他们添加可配置的日志记录。

关于java - 通过 log4j 发送 JNI C stderr/stdout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1982927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com