Jaki jest najbardziej wydajny rejestrator C ++ bezpieczny dla wątków? [Zamknięte]


85

Pracuję nad aplikacją wielowątkową o krytycznym znaczeniu dla wydajności. Przyjrzałem się rejestrowaniu rlog, Ace i Boost. Wybrałem rlog, ponieważ przeczytałem, że był najszybszy (gdy logowanie jest wyłączone, ma najmniejszy narzut).

Problem polega na tym, że pokazuje nazwę pliku, numer linii itp. Nawet w trybie wydania. Jeśli powiesz mi, jak wyłączyć te informacje, mój problem może zostać rozwiązany. W każdym razie, jaki jest najbardziej wydajny program rejestrujący w C ++ w mojej sytuacji?


23
Szybko dochodzę do wniosku, że boost ma wszystko. Nawet jeśli tak się nie stanie, pojawi się, gdy spojrzysz ponownie!
Martin Beckett

20
Nie rozumiem, dlaczego to jest zamknięte. Zadał konkretne i wymierne pytanie. Jeśli zaniedbamy używany kompilator, może istnieć tylko jeden „najbardziej wydajny, bezpieczny wątkowo program rejestrujący C ++”.
Stackoverflow


Odpowiedzi:


35

Niestety w tej chwili nie mogę głosować przeciw. O ile mogę powiedzieć, nigdy nie używaj bzdur, takich jak Apache log4cxx. Zawiera poważne błędy.

  1. Ostatnia wersja gałęzi 0.9 to 0.9.7 i nadal zawiera przecieki pamięci, ponieważ każda klasa z wirtualnymi składowymi nie ma wirtualnego dtora.
  2. Najnowsza wersja 0.10.x straciła wiele funkcji z wersji 0.9.xi nie jest kompatybilna wstecz. Jesteś zmuszony przepisać wiele własnego kodu.
  3. Cały projekt wydaje się być nieobsługiwany. Wydanie wersji 0.11.xx jest zapowiadane na 2 lata.

Moim zdaniem powinieneś iść z dopalaczem.


10
„każda klasa z wirtualnymi członkami nie ma wirtualnego dtora” nie wierzył w to i musiał to sprawdzić. Dość znikający Apache.
ManuelSchneid3r

6
Możesz teraz głosować przeciw :)
pozew Moniki

5
>> „Każda klasa z wirtualnymi członkami nie ma wirtualnego dtora” Chociaż nie jest to wspaniałe, nie oznacza to, że powoduje problem. Jest to problem tylko wtedy, gdy klasy są usuwane przez ich dynamiczny, a nie statyczny typ. Samo to nie jest problemem i nie oznacza, że ​​wyciek pamięci.
evilrix

1
@evilrix Klasy mają wirtualnych członków, ale nie mają wirtualnego nauczyciela. Klasy nie mają chronionych / prywatnych nowych operatorów. W rzeczywistości jest to bardzo słaby i zły kod, który nigdy nie powinien był zostać opublikowany. Więc o co ci chodzi?
kirsche40

@ kirsche40 Myślałem, że mój punkt widzenia był dość jasny. Którego fragmentu mojego wyjaśnienia dotyczącego sformułowania standardu nie zrozumieliście? Pozwólcie, że powtórzę: jest to problem, jeśli spróbujesz usunąć za pomocą wskaźnika klasy bazowej. W takim przypadku, jeśli destruktor nie jest wirtualny, zachowanie jest niezdefiniowane. W tej kwestii standard jest niezwykle jasny. Jestem prawie pewien, że nic z tego, co powiedziałem, nie sugeruje, że jestem zwolennikiem OP używa tego jako implementacji.
evilrix


10

Odniosłem sukces z log4cxx pod adresem http://logging.apache.org/log4cxx/index.html . Jest to wersja popularnego loggera Log4j w języku C ++, którą można łatwo skonfigurować za pomocą pliku conf lub w kodzie. Narzut, gdy jest wyłączony, jest minimalny (wywołanie metody i porównanie liczb całkowitych).

Wzorzec danych wyjściowych do dziennika jest definiowany przez wzorzec konwersji, który może być tak prosty, jak data / godzina i komunikat. Obsługuje również ograniczenie rozmiaru pliku, najazd itp. Możesz także skonfigurować różne wzorce dla różnych błędów i źródeł.


9

Oto jak możesz wyłączyć dodatkowe informacje, które daje rlog (takie jak nazwa pliku, numer linii itp.). Kiedy inicjalizujesz rlog w swojej main()funkcji (lub gdziekolwiek), możesz wykonać następujące czynności:

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

Drugi argument StdioNodedotyczy flag kontrolujących dane wyjściowe. Sprawdź dokumentację rlog (można ją wygenerować za pomocą Doxygen), aby uzyskać pełną listę możliwych flag. Ten w tym przykładzie sprawia, że ​​rlog tylko koloruje dane wyjściowe według ważności, bez dodawania żadnych innych informacji.


9

Możesz rozważyć system dziennika. logog oferuje dokładnie taką funkcjonalność, ale nie ma ukrytych zależności kodowych, które ma Pantheios. logog jest bezpieczny dla wątków i zapewnia wysoki stopień kontroli nad typami wiadomości, które są rejestrowane w dowolnym momencie.

Jestem autorem i opiekunem logoga, więc moja opinia jest nieco stronnicza. Ale przejrzałem rlog, Pantheios i inne systemy logowania przed wdrożeniem tego.

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


Zaktualizowany link, dziękuję za notatkę.
johnwbyrd

4

Niektóre z tych kosztów mogą wystąpić w Twoich makrach / strumieniach. Należy bardzo uważać, aby nie utworzyć ciągu rejestrowanego, gdy rejestrowanie jest wyłączone.

Sprytne wykorzystanie strumieni i operatora?: Pozwala to zrobić, podobnie jak makra.




2

wypróbuj bibliotekę c-log, https://github.com/0xmalloc/c-log , szybką, stabilną i bezpieczną dla wątków bibliotekę dziennika dla języka C / C ++.


8
Niestety c-log jest objęty licencją GPL, co oznacza, że ​​nie można go używać z oprogramowaniem niezgodnym z GPL (np. Komercyjnym, zastrzeżonym). To sprawia, że ​​jest bezużyteczny dla wielu użytkowników.
chris

teraz nie ma LICENCJI na github.com/0xmalloc/c-log Jest bezpłatna do użytku komercyjnego i osobistego.
user2538508

2
Czy jesteś autorem c-log? Jeśli tak, zdecydowanie sugeruję, abyś wyraźnie wskazał (na stronie Github, w pliku readme i komentarzach w kodzie źródłowym), na podstawie której licencja jest udostępniana. Nawet jeśli ma to być domena publiczna (czego nie polecam!), Powinieneś to wyraźnie zaznaczyć. Mając to na uwadze, istnieje wiele „przyjaznych komercyjnie” (tj. Liberalnych) licencji open source do wyboru - najpopularniejsze to Apache, BSD lub MIT.
chris

Tylko Linux? ( #include <pthread.h>...)
rustyx
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.