当前位置: 首页 > 面试题库 >

通过log4j发送JNI C stderr / stdout

楚茂实
2023-03-14
问题内容

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

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

谢谢


问题答案:

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

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

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

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

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

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

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



 类似资料:
  • 如何通过Azure从我的UWP-App向不同设备上的应用程序的其他实例发送推送通知? 以下是注册设备以接收推送的说明。(这是可行的)第二部分是关于如何在控制台应用程序上发送推送(这也是可行的)https://azure.microsoft.com/en-us/documentation/articles/notification-hubs-windows-store-dotnet-get-star

  • 我想在登录时向特定用户发送通知,我使用Firebase消息,我可以通过控制台发送通知,但我想使用发送到主题和request以Swift代码发送此通知。当我在postman中运行代码时,我无法实现http请求以发送通知。我有以下错误: 请求缺少身份验证密钥(FCM令牌)。请参阅FCM文档的“认证”部分,网址为https://firebase.google.com/docs/cloud-messagi

  • 问题内容: 大家好,我正尝试通过websockets发送javascript对象: faye-websockets文档说: send(message) 接受字符串或缓冲区,并通过连接向另一对等方发送文本或二进制消息。 服务器端我正在使用node和faye。 客户端: 我的错误是什么?谢谢 问题答案: WebSockets支持发送和接收:字符串,类型数组(ArrayBuffer)和Blob。发送之前

  • 问题内容: 我定义一个类,然后设置该类类型的对象。我想将此对象透明地发送到在另一台计算机上运行的另一个Java应用程序。什么是实现这一目标的最佳技术? 问题答案: 您可以使用Java API创建对象流并发送任何可序列化的对象。但您必须注意,这些内容不会通过网络进行加密: 在发送方方面: 在接收端:

  • 问题内容: 我有一个内置的javascript,它可以执行以下操作:通过ajax-> php-> sql获取内容,并在单击内容后在index.php上显示它,将显示新内容。 现在,我想拥有一个在将内容单击到php之后发送数据的函数,该函数将在db中执行某些操作。如何创建将发送数据的功能?谢谢! 这是我的显示内容的代码: }); }` 问题答案: 您可以通过在jQuery.ajax 设置中包含值,将

  • 我有一个 这个数组由保存的字符串和核心数据组成。我想通过空投发送这个。我已经签出了,并且我试图通过以下方式发送它 这给了我以下错误“NSInvalidArgumentException”,原因是:“JSON写入(证书)中的类型无效” 我已经将数据转换为字符串,所以不确定我在这里错过了什么 我研究了NSInvalidArgumentException,原因:“JSON写入中的类型无效(u NSDat