【问题标题】:Redirect std*** from C++ to Java for Logging将 std*** 从 C++ 重定向到 Java 以进行日志记录
【发布时间】:2011-01-09 19:10:46
【问题描述】:

我有一个 C++ 应用程序和一个 Java 应用程序需要以相同的方式记录消息。我的 Java 应用程序使用由 Log4j 配置支持的 Apache Commons Logging。我需要一个 log4j 配置,以便我可以在一个位置更改我的日志记录首选项。在我的 C++ 应用程序中,我捕获了对 printf() 和 fprintf(std***) 的所有调用,我认为我有以下选项:

  1. 在我的 C++ 应用程序中创建一个分支,从 (f)printf() 调用到新进程标准输入创建一个管道,并启动一个 Java 程序,该程序使用 Commons Logging 从标准输入和日志中读取数据

  2. 使用 JNI 的 JNI_CreateJVM() 在 C++ 应用程序中创建 JVM,并在调用 (f)printf() 时调用 Java 日志记录方法

  3. 使用类似 Log4cxx 的东西来读取与 Java 应用程序相同的配置并在 C++ 中本地登录

我想尽可能避免使用选项 3,因为我不想在我的应用程序中添加另一个第三方依赖项。我知道从 C++ 过渡到 Java 会产生性能成本,但我不确定它是否会那么重要。

【问题讨论】:

    标签: java c++ ipc pipe


    【解决方案1】:

    除了性能成本之外,除了选项 3 之外的任何东西都非常复杂 (*)。 另外,我不确定是否有一个 Java 库可以读取 InputStream 并将其转换为 Commons Logging 调用。即使有,为了能够使用 Java 端配置完全控制过滤,您需要将跟踪级别的所有内容记录到标准输出中(因为 C++ 代码不知道配置的日志级别),这听起来过分了。

    使用 Log4cxx,或者自己编写一些可以读取配置文件的 C++ 代码。

    (*) 好的,选项 4(有一个包装脚本,将 stderr/stdout 从未修改的 C++ 程序重定向到将输出转换为日志条目的 Java 程序)不会很复杂。

    【讨论】:

    • +1 选项 4——我会这样做,至少在它被证明不可行之前。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多