2014-02-22 10 views
16

Ich benutze NLog und nach dem empfohlenen Muster einer Protokolldeklaration für jede Klasse, mit dem Zweck zu verfolgen, welche Klasse/Methode in das Protokoll geschrieben hat. Ich finde das sehr nützlich, um bei jedem Log-Write ein bisschen eine "Stack Trace" auf der obersten Ebene zu haben.Hinzufügen Methodenname in NLog

Mein Code verwendet wie folgt aussehen:

class SomeClass { 

    private static readonly Logger logger = LogManager.GetCurrentClassLogger(); 
    void DoStuff() { 
     logger.Debug("stuff"); } 

} 

Ich hatte vor kurzem die Forderung mein einziges Projekt zu 3 separate Protokolldateien zu schreiben, und um dies zu tun, habe ich mehrere Logger und Ziele wie hier angegeben: https://stackoverflow.com/a/21711838/191206

Allerdings jetzt in meinen Protokolldateien habe ich den Namen der Klassenstufe verloren. Es schreibt jetzt nur den Protokollnamen, den ich in NLog.config angegeben habe. Ich habe einfach betrachtet Hinzufügen der Methode nennen mich mit einem Aufruf an

System.Reflection.MethodBase.GetCurrentMethod(); // use Name property 

oder etwas anderes in Reflexion mit wie this

aber ich frage mich, ob NLog gebaut hat etwas in das, was ich bin fehlt? Die Debug() Methode Ich sehe nur die Fähigkeit, eine Zeichenfolge zu schreiben, mit den Parametern & optional formatiert.

Ist dies in NLog integriert?

+3

Haben Sie das überprüft [ '$ {callsite}' Layout-Renderer] (https://github.com/nlog/nlog/wiki/Callsite-Layout-Renderer)? – nemesv

+0

das war es - könntest du diese frage mit dieser lösung beantworten, damit ich dir richtiges kredit geben kann? Vielen Dank – dferraro

Antwort

28

Es gibt eine built in layout renderer called ${callsite}, die Sie verwenden können, um den Anruf Site-Informationen (Klassennamen, Methodennamen und Quellinformationen) in die Protokolleinträge enthalten:

<targets> 
    <target 
    name="task1File" 
    xsi:type="File" 
    layout="${callsite} - ${message}" 
    fileName="${basedir}../Data/debugLog1.txt" 
    archiveAboveSize ="5000000" 
    maxArchiveFiles="2"/> 
    <target 
    name="task2File" 
    xsi:type="File" 
    layout="${callsite} - ${message}" 
    fileName="${basedir}../Data/debugLog2.txt" 
    archiveAboveSize ="5000000" 
    maxArchiveFiles="2"/> 
</targets>