Gemäß der NLog-Dokumentation:
Die meisten Anwendungen verwenden einen Logger pro Klasse, wobei der Name des Loggers mit dem Namen der Klasse übereinstimmt.
Dies ist die gleiche Art und Weise, wie log4net funktioniert. Warum ist das eine gute Praxis?
Antworten:
Mit log4net erleichtert die Verwendung eines Loggers pro Klasse das Erfassen der Quelle der Protokollnachricht (dh der Klasse, die in das Protokoll schreibt). Wenn Sie nicht einen Logger pro Klasse haben, sondern einen Logger für die gesamte App, müssen Sie auf weitere Reflexionstricks zurückgreifen, um zu wissen, woher die Protokollnachrichten stammen.
Vergleichen Sie Folgendes:
Protokoll pro Klasse
Ein Logger pro App (oder ähnlich)
Anhand des zweiten Beispiels müsste der Logger einen Stack-Trace erstellen, um zu sehen, wer ihn aufruft, oder Ihr Code müsste immer den Aufrufer übergeben. Mit dem Logger-pro-Klasse-Stil tun Sie dies immer noch, aber Sie können dies einmal pro Klasse anstatt einmal pro Aufruf tun und ein ernstes Leistungsproblem beseitigen.
quelle
Vorteil bei der Verwendung von "Logger pro Datei" in NLog: Sie haben die Möglichkeit, Protokolle nach Namespace und Klassennamen zu verwalten / filtern. Beispiel:
NLogger hat dazu ein sehr nützliches Code-Snippet. Das
nlogger
Snippet erstellt den folgenden Code:Also nur wenige Tastenanschläge und Sie haben Logger pro Klasse. Es werden Namespace und Klassenname als Name des Loggers verwendet. Um Ihrem Klassenlogger einen anderen Namen zu geben, können Sie Folgendes verwenden:
Und wie @JeremyWiebe sagte, müssen Sie keine Tricks anwenden, um den Namen der Klasse zu ermitteln, die versucht, eine Nachricht zu protokollieren: Der Name des Loggers (normalerweise der Name der Klasse) kann einfach in einer Datei protokolliert werden (oder ein anderes Ziel) durch Verwendung
${logger}
im Layout.quelle
Ich kann einige Gründe für diese Wahl sehen.
quelle
Es gibt auch einen Leistungsvorteil bei NLog. Die meisten Benutzer werden verwenden
Das Nachschlagen der aktuellen Klasse aus dem Stack-Trace erfordert etwas (aber nicht viel) Leistung.
quelle
In den meisten Fällen bietet der Name der Klasse einen guten Namen für den Logger. Beim Scannen der Protokolldateien können Sie die Protokollnachricht anzeigen und direkt einer Codezeile zuordnen.
Ein gutes Beispiel, bei dem dies nicht der beste Ansatz ist, sind die SQL-Protokolle von Hibernate. Es gibt einen gemeinsam genutzten Logger mit dem Namen "Hibernate.SQL" oder ähnliches, bei dem verschiedene Klassen Raw-SQL in eine einzelne Logger-Kategorie schreiben.
quelle
Aus entwicklungspolitischer Sicht ist es am einfachsten, wenn Sie nicht jedes Mal ein Logger-Objekt erstellen müssen. Wenn Sie dies jedoch nicht tun, sondern es mithilfe von Reflexion dynamisch erstellen, wird die Leistung verlangsamt. Um dies zu lösen, können Sie den folgenden Code verwenden, der den Logger dynamisch asynchron erstellt:
quelle
Zwei Gründe fallen mir sofort ein:
quelle
Wahrscheinlich, weil Sie Methoden protokollieren möchten, die nur für die Klasse sichtbar sind, ohne die Kapselung zu unterbrechen, ist es auch einfach, die Klasse in einer anderen Anwendung zu verwenden, ohne die Protokollierungsfunktion zu beeinträchtigen.
quelle
Erleichtert die Konfiguration von Appendern nach Namespace oder Klasse.
quelle
Wenn Sie NLOG verwenden, können Sie die Aufrufstelle in der Konfiguration angeben. Dadurch werden der Klassenname und die Methode aufgezeichnet, in der sich die Protokollierungsanweisung befand.
Sie können dann eine Konstante für Ihren Loggernamen oder den Assemblynamen verwenden.
Haftungsausschluss: Ich weiß nicht, wie NLOG diese Informationen sammelt. Meine Vermutung wäre eine Reflexion, daher müssen Sie möglicherweise die Leistung berücksichtigen. Es gibt einige Probleme mit Async-Methoden, wenn Sie NLOG v4.4 oder höher nicht verwenden.
quelle