Qual è il logger C ++ thread-safe più efficiente? [chiuso]


85

Sto lavorando a un'applicazione multi-thread critica per le prestazioni. Ho esaminato i log di rlog, Ace e Boost. Ho scelto rlog perché ho letto che era il più veloce (quando la registrazione è disabilitata, ha il minimo overhead).

Il problema che ho è che mostra il nome del file, il numero di riga ecc. Anche in modalità di rilascio. Se puoi dirmi come disattivare queste informazioni, il mio problema potrebbe essere risolto. In ogni caso qual è il logger in C ++ più efficiente per la mia situazione?


23
Sto rapidamente giungendo alla conclusione che la spinta ha tutto. Anche se non è apparso quando guarderai di nuovo!
Martin Beckett

20
Non riesco a vedere perché questo è chiuso. Ha posto una domanda specifica e misurabile. Se trascuriamo quale compilatore viene utilizzato, ci può essere solo un "logger C ++ thread-safe più efficiente". Stackoverflow in questi giorni ...
JohnJohn


Risposte:


35

Purtroppo al momento non posso votare a favore. Per quanto posso dire mai e poi mai usare schifezze come Apache log4cxx. Contiene bug gravi.

  1. L'ultima versione del ramo 0.9 è la 0.9.7 e contiene ancora perdite di memoria perché ogni classe con membri virtuali non ha un dtor virtuale.
  2. La versione più recente 0.10.x ha perso molte funzionalità dalla 0.9.x e non è retrocompatibile. Sei costretto a riscrivere molto del tuo codice.
  3. L'intero progetto sembra non essere mantenuto. Il rilascio di 0.11.xx è stato annunciato da 2 anni.

Secondo me dovresti andare con la spinta.


10
"ogni classe con membri virtuali non ha dtor virtuale" non ci credeva e doveva controllarlo. Apache piuttosto deludente.
ManuelSchneid3r

6
Puoi downvote ora :)
Finanzia la causa di Monica il

5
>> "ogni classe con membri virtuali non ha un dtor virtuale" Sebbene questo non sia meraviglioso, non significa che causi un problema. È solo un problema se le classi vengono eliminate dal loro tipo dinamico anziché statico. Questo, da solo, non è di per sé un problema e non significa che la memoria sia trapelata.
evilrix

1
@evilrix Le classi hanno membri virtuali ma nessun dtor virtuale. Le classi non hanno nuovi operatori protetti / privati. In realtà, questo è un codice molto povero e cattivo che non avrebbe mai dovuto essere rilasciato. Allora qual è il tuo punto?
kirsche40

@ kirsche40 Pensavo che il mio punto fosse abbastanza chiaro. Quale parte della mia spiegazione di come è formulato lo standard non hai capito? Consentitemi di riformulare: è un problema se si tenta di eliminare tramite un puntatore di classe base. In tal caso, se il distruttore non è virtuale, il comportamento è indefinito. Lo standard è insolitamente chiaro su questo punto. Sono abbastanza sicuro che niente di ciò che ho detto implica che sto sostenendo che l'OP lo usi come implementazione.
evilrix

19

Si ritiene che Pantheios sia la libreria di registrazione C ++ più performante , oltre a sostenere di essere l'unica che è sicura al 100% (vedere questo articolo su una libreria correlata che spiega perché le librerie basate su printf () / iostream non sono type- sicuro)


4
E anche se a loro non piace Pantheios, l'elenco dei "concorrenti" nella pagina che hai collegato è informativo.
jwd

10

Ho avuto successo con log4cxx su http://logging.apache.org/log4cxx/index.html . È una versione C ++ del popolare logger Log4j, è facile da configurare tramite un file di configurazione o nel codice. L'overhead quando è disabilitato è minimo (chiamata al metodo e confronto intero).

Il modello per l'output nel registro è definito da un modello di conversione che può essere semplice come la data / ora e un messaggio. Gestisce anche la limitazione della dimensione del file, il rollover, ecc. È inoltre possibile configurare diversi modelli per vari errori e origini.


9

Ecco come puoi disattivare le informazioni extra fornite da rlog (come il nome del file, il numero di riga ecc.). Quando inizializzi rlog nella tua main()funzione (o dovunque), potresti fare quanto segue:

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

Il secondo argomento StdioNodeè che i flag controllino l'output. Controllare la documentazione di rlog (può essere generata con Doxygen) per l'intero elenco di possibili flag. Quello nell'esempio qui fa in modo che rlog colora l'output solo in base alla gravità, senza aggiungere altre informazioni.


9

Potresti prendere in considerazione il sistema logog. logog offre esattamente questo tipo di funzionalità ma non ha le dipendenze di codice implicite che ha Pantheios. logog è thread-safe e consente un alto grado di controllo su quali tipi di messaggi vengono registrati in qualsiasi momento.

Sono l'autore e il manutentore di logog, quindi la mia opinione è un po 'di parte. Ma ho esaminato rlog, Pantheios e altri sistemi di registrazione prima di implementare questo.

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


Link aggiornato, grazie per la nota.
johnwbyrd

4

Alcuni dei sovraccarichi possono verificarsi nelle macro / flussi. Devi stare molto attento a non comporre la stringa che viene registrata quando la registrazione è disabilitata.

Un uso intelligente dei flussi e dell'operatore?: Ti consente di farlo, così come le macro.




2

prova la libreria c-log, https://github.com/0xmalloc/c-log , una libreria di log veloce, stabile e thread-safe per il linguaggio C / C ++.


8
Sfortunatamente c-log è sotto GPL, il che significa che non puoi usarlo con software non compatibile con la GPL (es. Commerciale proprietario). Questo lo rende inutilizzabile per molti utenti.
chris

ora non c'è LICENZA in github.com/0xmalloc/c-log È gratuito per uso commerciale e personale.
user2538508

2
Sei l'autore di c-log? In tal caso, ti suggerisco caldamente di indicare esplicitamente (sulla pagina Github, il file readme ei commenti nel codice sorgente) con quale licenza viene rilasciato il tuo software. Anche se deve essere di pubblico dominio (cosa che non consiglio!), Dovresti dichiararlo esplicitamente. Detto questo, ci sono molte licenze open source "commerciali" (cioè permissive) tra cui scegliere - le più popolari sono Apache, BSD o MIT.
chris

Solo Linux? ( #include <pthread.h>...)
rustyx
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.