argomento log4net per LogManager.GetLogger


98

Perché la maggior parte degli esempi di log4net ottiene il logger per una classe in questo modo:

private static ILog logger = 
    LogManager.GetLogger(
    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Piuttosto che passare semplicemente typeof (MyClass):

private static ILog logger = LogManager.GetLogger(typeof(MyClass));

C'è qualche altra ragione per farlo, oltre al fatto che la prima opzione non richiede di digitare un nome di classe specifico?

Risposte:


93

Penso che tu abbia la ragione. Lo faccio in questo modo, quindi non devo preoccuparmi del nome della classe e posso semplicemente copiare e incollare il codice della piastra della caldaia in una nuova classe.

Per la risposta ufficiale, vedere: Come posso ottenere il nome completo di una classe in un blocco statico? alle faq di log4net


Ok, questo chiarisce, grazie per quel link, non l'avevo visto prima
Andy White

Questo è vecchio quanto lo è, ma dai un'occhiata alla mia risposta nel caso in cui lo incolli ancora come codice della caldaia :)
Noctis

Risparmi un po 'di tempo per gli sviluppatori tagliando e incollando questo codice. Tuttavia esiste un costo per chiamare "GetCurrentMethod ()" invece di utilizzare una costante di stringa o chiamare "typeof ()". Se si sommano quante volte verrà chiamato nel corso della vita del codice rispetto al tempo impiegato per digitare il nome della classe, penso che si stia solo rallentando il codice per pochi vantaggi.
Youngs

1
Non stai rallentando tanto quanto pensi, questa è una chiamata statica, quindi hai una chiamata per classe per dominio dell'app, ad esempio se hai 300 classi hai al massimo 300 chiamate per tutta la vita della tua app
Paul Hatcher

Non ha senso usare la riflessione per ottenere il nome del tipo, e il copia / passato è pigrizia e ottieni un successo in termini di prestazioni, quindi perché non ottenere solo il nome ?!
MeTitus

8

Sono un utente NLog e di solito questo si riduce a:

var _logger = LogManager.GetCurrentClassLogger();

Sembrava un po 'strano che tu abbia bisogno di riflettere in Log4Net, quindi ho dato un'occhiata al codice sorgente NLog, ed ecco, questo è quello che fanno per te:

[MethodImpl(MethodImplOptions.NoInlining)]
public static Logger GetCurrentClassLogger()
{
    string loggerName;
    Type declaringType;
    int framesToSkip = 1;
    do
    {
#if SILVERLIGHT
        StackFrame frame = new StackTrace().GetFrame(framesToSkip);
#else
        StackFrame frame = new StackFrame(framesToSkip, false);
#endif
        var method = frame.GetMethod();
        declaringType = method.DeclaringType;
        if (declaringType == null)
        {
            loggerName = method.Name;
            break;
        }
        framesToSkip++;
        loggerName = declaringType.FullName;
    } while (declaringType.Module.Name.Equals("mscorlib.dll", StringComparison.OrdinalIgnoreCase));
    return globalFactory.GetLogger(loggerName);
}

Immagino che scriverei qualcosa di simile per Log4Net come estensione o metodo statico invece di incollare il riflesso come parte del codice della mia caldaia :)


7

Come dici tu, è conveniente in quanto puoi creare un logger in un metodo senza conoscere il nome della classe (banale lo so) ma ti consente di tagliare e incollare metodi tra le classi senza dover rinominare la chiamata.


3

Penso che il motivo sia che ottieni il tipo del tipo di runtime usando il .DeclaringType()metodo. È possibile utilizzare il logger in una classe base e continuare a vedere il tipo effettivo del proprio oggetto nell'output dei logger. Ciò rende le indagini molto più convenienti.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.