가장 효율적인 스레드 안전 C ++ 로거는 무엇입니까? [닫은]


85

성능이 중요한 다중 스레드 응용 프로그램을 작업 중입니다. rlog, Ace 및 Boost 로깅을 살펴 보았습니다. rlog가 가장 빠르기 때문에 선택했습니다 (로깅이 비활성화되면 오버 헤드가 가장 적음).

내가 가진 문제는 릴리스 모드에서도 파일 이름, 줄 번호 등을 표시한다는 것입니다. 해당 정보를 차단하는 방법을 알려 주시면 문제가 해결 될 수 있습니다. 어쨌든 내 상황에서 C ++에서 가장 효율적인 로거는 무엇입니까?


23
부스트에는 모든 것이 있다는 결론에 빠르게 도달하고 있습니다. 그렇지 않더라도 다시 보면 나타날 것입니다!
Martin Beckett

20
왜 이것이 닫혔는지 알 수 없습니다. 그는 구체적이고 측정 가능한 질문을했습니다. 사용중인 컴파일러를 무시하면 "가장 효율적인 스레드 안전 C ++ 로거" 가 하나만있을 수 있습니다 . 요즘 Stackoverflow ....
JohnJohn


답변:


35

안타깝게도 지금은 반대 투표를 할 수 없습니다. 내가 말할 수있는 한 Apache log4cxx와 같은 쓰레기를 절대 사용하지 마십시오. 심각한 버그가 포함되어 있습니다.

  1. 0.9 브랜치의 마지막 릴리스는 0.9.7이며 가상 멤버가있는 모든 클래스에는 가상 dtor가 없기 때문에 여전히 메모리 누수가 있습니다.
  2. 최신 릴리스 0.10.x는 0.9.x에서 많은 기능을 잃었으며 이전 버전과 호환되지 않습니다. 자신의 코드를 많이 다시 작성해야합니다.
  3. 전체 프로젝트가 유지되지 않는 것 같습니다. 0.11.xx의 릴리스는 2 년 동안 발표되었습니다.

제 생각에는 부스트를해야합니다.


10
"가상 구성원이있는 모든 클래스에는 가상 dtor가 없습니다."라고 믿지 않았고 확인해야했습니다. 꽤 실망스러운 Apache.
ManuelSchneid3r

6
지금 다운 투표 할 수 있습니다. :)
Fund Monica 's Lawsuit

5
>> "가상 멤버가있는 모든 클래스에는 가상 dtor가 없습니다."이것이 훌륭하지는 않지만 문제를 일으키는 것은 아닙니다. 클래스가 정적 유형이 아닌 동적으로 삭제되는 경우에만 문제가됩니다. 이것만으로는 그 자체가 문제가 아니며 메모리 누수를 의미하지도 않습니다.
evilrix

1
@evilrix 클래스 에는 가상 멤버가 있지만 가상 dtor는 없습니다 . 클래스에는 보호 된 / 개인적인 새 연산자가 없습니다. 사실, 이것은 절대로 공개해서는 안되는 매우 가난하고 나쁜 코드입니다. 그래서 당신의 요점은 무엇입니까?
kirsche40

@ kirsche40 내 요점이 꽤 분명하다고 생각했습니다. 표준이 어떻게 표현되는지에 대한 설명 중 어느 부분을 이해하지 못 하셨나요? 다시 말하겠습니다. 기본 클래스 포인터를 통해 삭제하려고하면 문제가됩니다. 이 경우 소멸자가 가상이 아니면 동작이 정의되지 않습니다. 이 점에서 표준은 매우 명확합니다. 나는 내가 말한 것 중 어느 것도 OP가 이것을 구현으로 사용한다고 옹호하고 있음을 암시하지 않는다고 확신합니다.
evilrix

19

Pantheios는 최고의있을 것으로 생각된다 라이브러리를 기록 ++ C를 수행 뿐만 아니라, 100 %의 형태 보증 된 유일한 일이라고 주장합니다 ( 이 기사를 왜의 printf () / iostream 기반 라이브러리가없는 타입 - 설명하는 관련 라이브러리에 대해 안전한)


4
Pantheios를 좋아하지 않더라도 링크 한 페이지에있는 '경쟁자'목록은 유익합니다.
jwd

10

http://logging.apache.org/log4cxx/index.html 에서 log4cxx로 성공했습니다 . 인기있는 Log4j 로거의 C ++ 버전으로 conf 파일이나 코드를 통해 쉽게 구성 할 수 있습니다. 비활성화 된 경우 오버 헤드는 최소화됩니다 (메서드 호출 및 정수 비교).

로그에 대한 출력 패턴은 날짜 / 시간 및 메시지처럼 간단 할 수있는 변환 패턴으로 정의됩니다. 또한 파일 크기 제한, 롤오버 등을 처리합니다. 다양한 오류 및 소스에 대해 다른 패턴을 구성 할 수도 있습니다.


9

rlog가 제공하는 추가 정보 (예 : 파일 이름, 줄 번호 등)를 차단하는 방법은 다음과 같습니다. main()함수 (또는 모든 위치) 에서 rlog를 초기화 할 때 다음을 수행 할 수 있습니다.

rlog::RLogInit(argc, argv);
rlog::StdioNode slog (2, rlog::StdioNode::OutputColor);
slog.subscribeTo( RLOG_CHANNEL("error") );

의 두 번째 인수 StdioNode는 플래그가 출력을 제어하는 ​​것입니다. 가능한 플래그의 전체 목록은 rlog 문서 (Doxygen으로 생성 가능)를 확인하십시오. 여기 예제의 하나는 rlog가 다른 정보를 추가하지 않고 심각도에 따라 출력에만 색상을 지정하도록합니다.


9

로고 시스템을 고려할 수 있습니다. logog는 정확히 이런 종류의 기능을 제공하지만 Pantheios가 가지고있는 암시 적 코드 종속성이 없습니다. logog는 스레드로부터 안전하며 언제든지 기록되는 메시지 유형에 대한 높은 수준의 제어가 가능합니다.

저는 logog의 저자이자 관리자이기 때문에 제 의견은 약간 편견이 있습니다. 그러나 이것을 구현하기 전에 rlog, Pantheios 및 기타 로깅 시스템을 검토했습니다.

https://github.com/johnwbyrd/logog .


업데이트 된 링크, 메모 감사합니다.
johnwbyrd

4

일부 오버 헤드는 매크로 / 스트림에서 발생할 수 있습니다. 로깅이 비활성화 된 경우 로깅되는 문자열을 구성하지 않도록 매우주의해야합니다.

스트림과? : 연산자를 잘 사용하면 매크로처럼 그렇게 할 수 있습니다.



2

스레드로부터 안전한지 여부는 모르겠지만 pantheios 일 수도 있습니다
.


8
스레드로부터 안전합니다
dcw

2

빠르고 안정적이며 스레드로부터 안전한 C / C ++ 언어 용 로그 라이브러리 인 c-log lib, https://github.com/0xmalloc/c-log를 사용해보십시오 .


8
안타깝게도 c-log는 GPL하에 있으므로 GPL과 호환되지 않는 (예 : 독점 상용) 소프트웨어와 함께 사용할 수 없습니다. 이로 인해 많은 사용자가 사용할 수 없습니다.
chris

이제 github.com/0xmalloc/c-log 에는 라이센스가 없습니다 . 상업적 및 개인적인 용도로 무료입니다.
user2538508 2014-08-27

2
당신은 c-log의 저자입니까? 그렇다면 소프트웨어가 출시되는 라이선스에 따라 명시 적으로 명시 (Github 페이지, readme 파일 및 소스 코드의 주석) 할 것을 강력히 제안합니다. 퍼블릭 도메인 (권장하지 않습니다!)을 의미하더라도 명시 적으로 명시해야합니다. 즉, 선택할 수있는 "상업 친화적"(허용적인) 오픈 소스 라이선스가 많이 있습니다. 가장 인기있는 것은 Apache, BSD 또는 MIT입니다.
chris

Linux 만? ( #include <pthread.h>...)
rustyx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.