Sto costruendo un servizio in .NET che elabora "cose" in background e vorrei tracciare l'esecuzione di queste cose per articolo, non per applicazione.
La maggior parte dei framework di logging (ho familiarità con System.Diagnostics.TraceSource e NLog) funzionano in modo da generare messaggi per tutto e decidere in un file di configurazione cosa e dove archiviare utilizzando i filtri.
Ma in questo caso, potrei elaborare decine di migliaia di elementi in un dato momento, e ho solo bisogno di registrare le informazioni per uno di essi. La quantità di informazioni di log che ho generato per articolo è enorme, e non è solo una stringa con alcuni parametri, quindi preferirei evitare l'elaborazione non necessaria e l'IO.
Sto già usando NLog per le eccezioni delle applicazioni e cose del genere, quindi per questo uso specifico non ho bisogno di livelli di log (informazioni, errori, avvisi, eccezioni). Tutte le voci sono "voci di informazione" come i dati che vengono generati o la decisione che è stata presa dai passaggi, quindi possiamo analizzare cosa sta succedendo per determinati articoli in produzione.
Un'ultima nota è che queste informazioni non verranno memorizzate su un file, ma verranno memorizzate in memoria e inviate tramite socket Web a un servizio di ascolto. Se la connessione non è attiva, eliminiamo semplicemente i dati.
Ho già alcuni flag per elemento che elaboro in un oggetto di contesto, come:
interface IItemContext {
Guid ItemID { get; }
bool StepXLoggingEnabled { get; }
bool StepYLoggingEnabled { get; }
bool StepZLoggingEnabled { get; }
}
Il mio attuale approccio è quello di avere un sacco di metodi di estensione sull'oggetto Context che decidono se la registrazione dovrebbe avvenire e estrarre le informazioni necessarie e delegare a un altro servizio.
internal static class ItemContextLogExtensions {
public static void LogStepX(this IItemContext context, string data1, Foo data2) {
if (context.StepXLoggingEnabled) {
// do some work to extract/generate information relevant to my logging
var entry = new LogEntry {
Message = "StepX ...",
Details = ""
};
SomeLogService.Current.Log(entry);
}
}
}
In questo modo posso controllare quando è necessario generare il log e delegarlo a NLog durante lo sviluppo, se necessario.
Continuo a pensare di usare solo NLog o TraceSource direttamente in IItemContext, ma mentre non voglio reinventare la ruota, mi chiedo se abbia senso provare a usarli per questo. Mi sembra che in questo caso, questi framework finiranno per essere solo una gloriosa coda concorrente con un sacco di metodi per i quali non ho bisogno.
Che ne pensi? Il mio prendere una buona soluzione? Mi sto perdendo qualcosa? Quali potrebbero essere altre opzioni per raggiungere questo obiettivo?
E mi mancano alcune funzionalità di NLog o qualche altra libreria di logging .NET specificamente orientata verso questo tipo di registrazione che può essere abilitata per articolo invece che per applicazione?