栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

通过log4j发送JNI C stderr / stdout

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通过log4j发送JNI C stderr / stdout

注意:我尚未尝试此答案;YMMV。

POSIX方法

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

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

  1. 您需要确保Java程序本身不使用标准流,因为它们也会被重定向。一种解决方法是
    System.out
    在程序启动时将et 更改为其他名称。
  2. 第三方库可能会绕过标准文本流,而直接写入基础文件描述符。这不太可能,但有可能。我不记得freopen()只是更改了缓冲流使用的文件描述符,还是实际上重新打开了底层fd。
  3. 您仍然会有将对“文件”的更改连接到记录器的问题。

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

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

或与编写该库的人员交谈,以使他们添加可配置的日志记录。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/428684.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号