Il contesto: Stiamo lavorando su un'applicazione multi-thread (Linux-C) che segue un modello di pipeline.
Ogni modulo ha un thread privato e oggetti incapsulati che eseguono l'elaborazione dei dati; e ogni fase ha una forma standard di scambio di dati con l'unità successiva.
L'applicazione è priva di perdite di memoria ed è protetta da un blocco tramite i blocchi nel punto in cui vengono scambiati i dati. Il numero totale di thread è di circa 15 e ciascun thread può contenere da 1 a 4 oggetti. Fare circa 25 - 30 oggetti dispari che hanno tutti un registro critico da fare.
La maggior parte delle discussioni ho visto su diversi livelli come in Log4J e sono altre traduzioni. Le vere domande più importanti riguardano il modo in cui la registrazione complessiva dovrebbe realmente accadere?
Un approccio è tutto il logging locale fa fprintf
a stderr
. Lo stderr viene reindirizzato su un file. Questo approccio è molto negativo quando i registri diventano troppo grandi.
Se tutti gli oggetti istanziano i loro logger individuali (circa 30-40 di questi) ci saranno troppi file. E a differenza di quanto sopra, non si avrà l'idea del vero ordine degli eventi. Il timestamp è una possibilità - ma è ancora un casino da raccogliere.
Se esiste un unico modello di logger globale (singleton), blocca in modo indiretto tanti thread mentre uno è occupato a caricare i registri. Questo è inaccettabile quando l'elaborazione dei thread è pesante.
Quindi quale dovrebbe essere il modo ideale per strutturare gli oggetti di logging? Quali sono alcune delle migliori pratiche nelle attuali applicazioni su larga scala?
Mi piacerebbe anche imparare da alcuni dei progetti reali di applicazioni su larga scala per ottenere ispirazione da!
======
EDIT:
In base a entrambe le risposte, ecco la domanda che mi rimane ora:
Qual è la migliore pratica sull'assegnazione dei logger (code di registrazione) all'oggetto: dovrebbero chiamare alcuni global_api () o il logger dovrebbe essere loro assegnato nel costruttore. Quando gli oggetti sono in una gerarchia profonda questo approccio successivo diventa noioso. Se richiamano alcuni global_api () è un tipo di accoppiamento con l'applicazione, quindi provare a utilizzare questo oggetto in un'altra applicazione genera questa dipendenza. C'è un modo più pulito per questo?