我有一个 C++ 应用程序和一个 Java 应用程序,它们需要以相同的方式记录消息。我的 Java 应用程序使用由 Log4j 配置支持的 Apache Commons Logging。我需要一个 log4j 配置,以便我可以在一个位置更改我的日志记录首选项。在我的 C++ 应用程序中,我捕获了对 printf() 和 fprintf(std***) 的所有调用,并且我认为我有以下选项:
在我的 C++ 应用程序中 fork,从 (f)printf() 调用到新进程 stdin 创建一个管道,并启动一个 Java 程序,该程序从 stdin 读取并使用 Commons Logging 记录
使用 JNI 的 JNI_CreateJVM() 在 C++ 应用程序中创建一个 JVM,并在进行 (f)printf() 调用时调用 Java 日志记录方法
使用 Log4cxx 之类的东西来读取与 Java 应用程序相同的配置并在 C++ 中本地登录
我想尽可能避免选项 3,因为我不想向我的应用程序添加另一个第三方依赖项。我知道从 C++ 过渡到 Java 会产生性能成本,但我不确定它是否会那么重要。
除了性能成本之外,除了选项 3 之外的任何选项都非常复杂 (*)。另外,我不确定是否有一个 Java 库可以读取 InputStream 并将其转换为 Commons Logging 调用。即使有,为了能够使用 Java 端配置完全控制过滤,您需要将跟踪级别的所有内容记录到 stdout 中(因为 C++ 代码不知道配置的日志级别),这也听起来过多的 。
使用Log4cxx,或者自己编写一些可以读取配置文件的C++代码。
(*) 好吧,选项 4(有一个包装器脚本,将 stderr/stdout 从未经修改的 C++ 程序重定向到将输出转换为日志条目的 Java 程序)不会很复杂。
归档时间: |
|
查看次数: |
715 次 |
最近记录: |