Перенаправление std *** из C ++ в Java для ведения журнала - PullRequest
4 голосов
/ 27 января 2010

У меня есть приложение C ++ и приложение Java, которые должны регистрировать сообщения таким же образом. Мое Java-приложение использует протоколирование Apache Commons, поддержанное конфигурацией Log4j. Мне нужна одна конфигурация log4j, чтобы я мог изменить свои настройки ведения журнала в одном месте. В моем приложении C ++ я перехватил все вызовы printf () и fprintf (std ***) и думаю, что у меня есть следующие опции:

  1. Разветвите в моем приложении C ++, создайте канал из (f) printf () для вызовов новых процессов stdin и запустите программу Java, которая читает из stdin и журналы, используя Commons Logging

  2. Создать JVM в приложении C ++, используя JNI JNI_CreateJVM (), и вызывать метод ведения журнала Java, когда выполняются вызовы (f) printf ()

  3. Используйте что-то вроде Log4cxx для чтения той же конфигурации, что и приложение Java, и ведите собственный журнал в C ++

Я бы хотел как можно больше избегать варианта 3, поскольку не хочу добавлять сторонние зависимости в мои приложения. Я понимаю, что переход с C ++ на Java сопряжен с производительностью, но я не уверен, будет ли это так важно.

1 Ответ

3 голосов
/ 27 января 2010

В дополнение к стоимости исполнения все, кроме варианта 3, также ужасно сложно (*). Кроме того, я не уверен, что есть библиотека Java, которая читает InputStream и преобразует его в вызовы Commons Logging. Даже если это возможно, чтобы иметь возможность полностью контролировать фильтрацию с помощью конфигурации на стороне Java, вам потребуется записать все на уровне трассировки в стандартный вывод (поскольку код C ++ не знает о настроенных уровнях журнала), что также звучит чрезмерный.

Перейдите к Log4cxx или создайте некоторый код C ++, который может прочитать файл конфигурации самостоятельно.

(*) Хорошо, вариант 4 (иметь скрипт-обертку, который перенаправляет stderr / stdout из вашей немодифицированной программы C ++ в программу Java, которая переводит выходные данные в записи журнала) не будет очень сложным.

...