Domanda

Sto studiando le differenze tra l'utilizzo di log4net e System.Diagnostics.Trace per la registrazione e sono curioso delle differenze di prestazioni che ho osservato.

Ho creato un'applicazione di prova per confrontare le prestazioni di entrambi i metodi di registrazione in diversi scenari e sto scoprendo che log4net è significativamente più lento della classe Trace . Ad esempio, in uno scenario in cui registro 1.000 messaggi senza formattazione di stringhe, il tempo medio di esecuzione di log4net su 1.000 prove è di 9,00 ms. Trace viene eseguito con una media di 1,13 ms. Molti dei miei casi di test presentano una varianza relativamente elevata nei tempi di esecuzione di log4net; la natura periodica di lunghe esecuzioni anomale sembra suggerire interferenze GC. Frugare con CLR Profiler conferma che ci sono molte raccolte per una tonnellata di oggetti log4net.Core.LoggingEvent che vengono generati (per essere onesti, sembra che Trace generi una tonnellata di oggetti Char [] , ma non mostra la grande varianza di log4net.)

Una cosa che tengo a mente qui è che anche se log4net sembra circa 9 volte più lento di Trace , la differenza è di 8ms su 1.000 iterazioni; questo non è esattamente un significativo calo delle prestazioni. Tuttavia, alcuni dei miei casi d'uso previsti potrebbero essere metodi di chiamata che registrano le cose centinaia di migliaia di volte e questi numeri provengono dalla mia macchina veloce. Su una macchina più lenta più tipica delle configurazioni dei nostri utenti la differenza è da 170 ms a 11 ms, il che è un po 'più allarmante.

Queste prestazioni sono tipiche di log4net o ci sono alcuni gotcha che possono aumentare significativamente le prestazioni di log4net?

( NOTA: sono consapevole che la formattazione delle stringhe può alterare il tempo di esecuzione; sto cercando di confrontare le mele con le mele e ho casi di test senza formattazione e casi di test con formattazione; log4net rimane proporzionalmente lento se stringa la formattazione viene utilizzata o meno. )

La storia finora:

  • Robert Gould ha la migliore risposta alla domanda; Ero principalmente curioso di sapere se era normale vedere log4net eseguire molto più lentamente della classe Trace .
  • La risposta di Alex Shnayder è un'informazione interessante ma in realtà non rientra nell'ambito della domanda. La metà dell'intento per l'introduzione di questo logging è di assistere nel debug di problemi sia logici che prestazionali su sistemi live; i nostri clienti mettono i nostri prodotti in molti scenari esotici che sono spesso difficili da riprodurre senza configurazioni hardware costose e su larga scala. La mia preoccupazione principale è che una grande differenza temporale tra "non registrare". e " registrazione " potrebbe influenzare il sistema in modo tale che non si verifichino bug. Alla fine, la scala della riduzione delle prestazioni è grande ma l'entità è piccola, quindi spero che non sarà un problema.
È stato utile?

Soluzione

sì log4xxx è più lento di trace, poiché trace è normalmente uno strumento vicino al kernel, mentre log4xxx è uno strumento molto più potente. Personalmente preferisco log4xxx per la sua flessibilità, ma se vuoi qualcosa che non abbia un impatto così grande e non hai davvero bisogno dei log per la produzione, diciamo che nel debug dovrebbe essere sufficiente solo la traccia.

Nota: utilizzo log4xxx perché lo stesso vale per tutte le lingue con una libreria log4 non solo .Net

Altri suggerimenti

potresti essere interessato alla libreria Common.Logging . È un wrapper di astrazione sottile rispetto alle implementazioni di registrazione esistenti e consente di collegare qualsiasi framework di registrazione che ti piace in fase di esecuzione. Inoltre è molto più veloce di System.Diagnostics.Trace come descritto nel mio post sul blog sulle prestazioni .

hth, Erich

Dalla mia esperienza, le prestazioni di log4net non sono un problema nella maggior parte dei casi. La vera domanda è: perché dovresti persino "registrare le cose centinaia di migliaia di volte"? in un sistema di produzione.
A mio avviso, in produzione è necessario registrare solo il minimo indispensabile (informazioni potrebbe essere a livello di avviso) e solo se necessario (debug di un problema sul sito) dovrebbe attivare il debug a livello di debug.

Se vuoi il meglio dei due mondi, log4net ti permetterà di accedere anche al tracciante aspnet. Attivo questa opzione quando voglio ottenere statistiche sulle prestazioni che sono legate a eventi specifici nella mia registrazione.

Ho appena eseguito un test confrontando la scrittura sequenziale in un semplice file rispetto all'utilizzo di Log4Net per lo stesso compito. Log4Net è circa 400 volte più lento rispetto a uno StreamWriter. Quindi considero Log4Net non utilizzabile se stai scrivendo in grande file di log . Ma lo trovo molto utile per piccole quantità di voci di registro e debug.

Forse una soluzione per isolare la registrazione in un thread separato in alcuni casi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top