2010-01-27 1 views
4

동일한 방법으로 메시지를 기록해야하는 C++ 응용 프로그램과 Java 응용 프로그램이 있습니다. 내 Java 응용 프로그램은 Log4j 구성에 의해 지원되는 Apache Commons Logging을 사용합니다. 로깅 환경 설정을 한 위치에서 변경할 수 있도록 단일 log4j 구성이 필요합니다. 내 C++ 응용 프로그램에서 나는 (printf와 모든 통화를 캡처 한)과는 fprintf (표준 ***) 나는 다음과 같은 옵션이 생각하고 :std ***를 로깅을 위해 C++에서 Java로 리디렉션

내 C에서
  1. 포크 ++ 응용 프로그램은, (F에서 파이프를 만들) 새로운 프로세스 stdin을 printf() 호출하고 Commons Logging을 사용하여 표준 입력 및 로그에서 읽는 Java 프로그램을 시작하십시오.

  2. JNI의 JNI_CreateJVM()을 사용하여 C++ 응용 프로그램에서 JVM을 만들고 Java 로깅 메소드를 호출하십시오. (f) printf() 호출이 이루어짐

  3. Log4cxx와 같은 것을 사용하여 Java 응용 프로그램과 동일한 구성을 읽고 기본적으로 로깅합니다 C++에서

내 응용 프로그램에 다른 타사 종속성을 추가하고 싶지 않기 때문에 가능한 한 옵션 3을 피하고 싶습니다. C++에서 Java로 넘어가는 데 드는 퍼포먼스 비용이 있다는 것을 이해합니다. 그러나 그 정도면 중요 할 지 모르겠습니다.

답변

3

성능 비용 외에도 옵션 3을 제외한 모든 것도 끔찍하게 복잡합니다 (*). 또한, InputStream을 읽고 Commons Logging 호출로 변환하는 Java 라이브러리가 있는지 확신하지 못합니다. Java 측 구성으로 필터링을 완전히 제어 할 수 있도록하려면 추적 레벨의 모든 것을 stdout에 기록해야합니다 (C++ 코드는 구성된 로그 레벨을 알지 못하기 때문에). 과도한.

Log4cxx로 이동하거나 직접 구성 파일을 읽을 수있는 C++ 코드를 만드십시오.

(*) 알맞은 옵션 4 (stderr/stdout를 수정되지 않은 C++ 프로그램에서 출력을 로그 항목으로 변환하는 Java 프로그램으로 리디렉션하는 래퍼 스크립트가 있음)은 그리 복잡하지 않습니다.

+1

옵션 4의 경우 +1입니다. 적어도 그렇게되면 작동하지 않는 것으로 나타납니다. –

관련 문제