Tracciamento e registrazione per articolo anziché per applicazione

0

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?

    
posta Natan 19.12.2014 - 16:00
fonte

1 risposta

1

Questo urla per un appender personalizzato Log4Net. Puoi scriverne uno tuo, farlo controllare l'elemento attivo per determinare se eseguire il log o meno e accedere a un buffer di memoria per-item.

    
risposta data 20.12.2014 - 00:58
fonte

Leggi altre domande sui tag