2011-01-15 14 views
1

Ich sehe, dass LogNet typischerweise mit einer statischen Variablen instanziiert wird:Log4Net und Speicherverbrauch

static logger = LogManager.GetLogger(frame.GetMethod().DeclaringType); 

Dumme Frage, aber:

1) Ist das nicht ein bisschen ärgerlich --- dh. Ich muss dieses Chaos eines Anrufs in jedem Logging-Stück meines Codes haben.

2) Generiert dies nicht viel Speicherplatz Overhead --- dh. Jeder einzelne meiner Klassen wird einer separaten Protokollierungsklasse zugeordnet. 300 Klassen, die die Protokollierung verwenden, erzwingen die Verwendung von 300 statischen Protokollvariablen? Erscheint merkwürdig.

+0

Es ist nicht wie ein paar hundert kleine Objekte sind so teuer ... – CodesInChaos

+0

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? –

+2

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. –

Antwort

0

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.

+0

-1 für den nicht statischen Vorschlag (die gleiche Menge an Draht-up-Code verlassen), +1 für die Erwähnung benannter Instanz;) –

+0

@KenHenderson: keine Notwendigkeit, statische zu verwenden, wie StefanEgli in seiner Antwort darauf hingewiesen hat. Log4Net hat einen Pool von Loggern. – Askolein

+0

@Askolein - meine erste Zeile erwähnt, dass Sie keine statische Variable benötigen. Können Sie mir sagen, welcher Teil der Antwort den Gebrauch von "static" erwähnt/impliziert, so dass ich ihn aktualisieren kann, um die Absichten meiner Antwort korrekt wiederzugeben? –

2

log4net unterhält ein Repository von Loggern, Sie müssen sie nicht statisch machen. Es empfiehlt sich, einen benannten Logger pro Klasse zu verwenden. Sie müssen sich keine Gedanken über den "Overhead" machen, wenn Sie ein paar hundert Logger im Speicher haben. Wenn das ein Problem wäre, müssten Sie wahrscheinlich die Protokollierung vollständig entfernen.

Das Protokollieren ist unordentlich, d. H. Es stopft Ihren Code mit Dingen, die nicht wirklich Teil des Geschäfts sind. Aspect Orient-Programmierung könnte Ihnen helfen, there.