Sie brauchen/müssen keine statische Variable verwenden. Typischerweise wird meine Klassen etwas aussehen
public class Foo
{
private ILog Logger;
public Foo()
{
Logger = LogManager.GetLogger(GetType());
}
//rest of class here
}
Dieser ziemlich sauber ist und bis ich ein Speicherproblem haben, gibt es keinen Punkt in der frühen Optimierung der Speichernutzung der Anwendung. Allerdings führen nicht alle meine Klassen Protokollierung durch, also haben nur diejenigen, die dies tun/müssen, dieses Bit in ihnen. Wenn jeder Ihrer Klassen protokolliert wird, dann klingt es so, als würden Sie zu viel Logging machen, entweder das oder Sie haben es mit einer ziemlich großen Anwendung zu tun (basierend auf der Tatsache, dass Sie 300 Klassen in das Log schreiben). Wenn dies der Fall ist, dann sind 300 Instanzen einer Protokollierungsklasse wahrscheinlich kein signifikanter Teil des Speicherbedarfs.
Sie können den Logger stattdessen als benannte Instanz ILog Logger = LogManager.GetLogger("MyNamedLogger");
einrichten und diese "benannte" ILog-Instanz über mehrere Klassen hinweg verwenden. Beachten Sie, dass Sie aufgrund der Art und Weise, wie die Protokollmeldungen im Allgemeinen ausgeschrieben werden, den Nutzen der protokollierten Nachrichten verlieren. Das könnte man auf verschiedene Arten kompensieren.
Es ist nicht wie ein paar hundert kleine Objekte sind so teuer ... – CodesInChaos
Nun, es scheint immer noch ein Schmerz aus einer Codierung Perspektive ... Zum Beispiel muss ich daran erinnern, den Logger jedes Mal als 'statisch' instanziieren. Wenn ich das vergesse, bekomme ich eine Leistungsstrafe. Gibt es Tricks, um dieses Problem zu vermeiden oder zu vereinfachen? –
Ich bin mir nicht sicher, aber die * GetLogger() * Methode ** kann ** den gleichen Logger zurückgeben, wenn er mit demselben Argument aufgerufen wird. Wenn Sie also 300 Instanzen einer Klasse haben, sollten Sie eine einzige Logger für alle haben. –