Fondamentalmente voglio scrivere un logger/tracciante cliente che registra anche il nome della classe e del metodo che chiama il logger/tracciante. Questo dovrebbe essere veloce in modo che non influenzi le prestazioni dell'applicazione, fortemente digitato e pulito. Qualcuno ha buone idee?Qual è il modo più performante per registrare il nome di classe e metodo?
Ecco i pochi che ho avuto, ma mi preoccupo per le prestazioni a causa di riflessione: (? Troppo in alto)
StackTrace/StackFrame
MethodInfo.GetCurrentMethod() (ancora troppo lento? e non molto pulita) metodo
passaggio come delegato (C# può farlo in modo implicito e non ho accesso al MethodInfo, ma non molto pulita)
Apprezzo i commenti di chiunque.
UPDATE:
Mi è piaciuta la pulizia generale di StackFrame così ho fatto una domanda più specifica here per quanto riguarda le prestazioni di StackFrame e ho ottenuto alcuni buoni di risposta compresi i test di performance. Si scopre che MethodInfo.GetCurrentMethod()
è il più veloce (richiede circa 1 microsecondo sul mio computer) e new StackFrame(1)
può essere richiesto su richiesta (richiede circa 15-20 microsecondi sul mio computer). Ho buttato il metodo come opzione delegato poiché è troppo disordinato quando il metodo ha diversi parametri.
CONCLUSIONE:
Ho guardato tutte le opzioni e la migliore è quello di scrivere un plug-in personalizzato per PostSharp che inietta il nome del metodo come stringa in MSIL durante la compilazione quando si applica un attributo personalizzato come [Trace]
ad esso. È l'opzione più veloce e più gestibile a mio avviso. Ciò consente anche molte più cose come passare i nomi e gli argomenti dei parametri senza alcun tipo di riflessione e le eccezioni di cattura e registrazione automaticamente. Questo my related question per ulteriori informazioni.
posso chiedere, perché non si desidera utilizzare log4net? – nWorx
Anche a me non piace fare affidamento su altri componenti. E anche nel caso di log4net, è troppo complesso. –
Hermann, questo è generalmente indicato nel nostro settore come "sindrome non inventata qui" ed è meglio evitarlo. Ecco un link di Wikipedia con ulteriori informazioni su questa afflizione: http://en.wikipedia.org/wiki/Not_Invented_Here –