2008-10-07 9 views
6

Ich bin ein großer Fan von log4net, aber vor kurzem haben einige (in meiner Abteilung) die Aufnahme in unsere Projekte in Frage gestellt wegen der scheinbar Schwere jeder Protokollierungsmethode. Ich würde argumentieren, dass es bessere Techniken als andere gibt, aber das ist eine andere Frage.Wie schnell ist eine log4net Logging-Methode (Debug, Info, etc)?

Ich bin neugierig zu wissen, was ist die typische Auswirkung eines Aufrufs log4net DebugFormat-Typ auf Ihre Anwendungen. Ich werde Variablen wie die Anzahl der Protokollanweisungen pro Codezeilen usw. weglassen, weil ich nur nach etwas suche, das Sie in der realen Welt gesehen haben.

Und ich bin mir der einfache Technik eine Schutzklausel lange Auswertung Aussagen der Zugabe von zB:

if (log.IsDebug) 
{ 
    log.DebugFormat(...); 
} 

Also, lassen wir das ausschließen aus der Betrachtung vorerst.

+0

Protokollieren Sie auf der Konsole, in einer Datei, in einer Datenbank? Das ist sehr wichtig für die Leistung. –

Antwort

11

Ich bin nicht vertraut mit log4net oder log.DebugFormat (...).

Aber die Kosten der Protokollierung ist wirklich in zwei Bereichen.

Der erste ist der Protokollierungsaufruf, und der zweite ist das tatsächliche Fortbestehen der Protokollinformationen.

Die Wächter helfen, den Protokollierungsaufruf auf ein Minimum zu reduzieren, wenn die Protokollierung nicht wirklich notwendig ist. Es neigt dazu, sehr schnell zu sein, da es wenig mehr als ein Methodenaufruf und ein Vergleich von zwei Skalaren ist.

Wenn Sie jedoch keine Wächter verwenden, können die Kosten zum Preis für die Erstellung der eigentlichen Protokollargumente werden.

Zum Beispiel in log4j, das ein gemeinsames Idiom war:

log.debug("Runtime error. Order #" + order.getOrderNo() + " is not posted."); 

Hier sind die Kosten die tatsächliche Bewertung der String-Ausdruck die Meldung zu machen. Dies liegt daran, dass dieser Ausdruck und die resultierende Zeichenfolge unabhängig von der Protokollierungsebene erstellt werden. Stellen Sie sich vor, wenn stattdessen hatte man so etwas wie:

log.debug("Something wrong with this list: " + longListOfData); 

, die ein großes und teure String-Variable erstellen könnten, die, wenn die Protokollebene nicht für DEBUG gesetzt wurde, würde einfach verschwendet werden.

Die Wächter:

if (log.isDebug()) { 
    log.debug(...); 
} 

dieses Problem beseitigen, da der IsDebug Anruf billig, vor allem im Vergleich zur tatsächlichen Schaffung des Arguments.

In meinem Code, ich habe einen Wrapper für die Protokollierung geschrieben, und ich kann Protokolle wie folgt erstellen:

log.debug("Runtime error. Order # {0} is not posted.", order.getOrderNo()); 

Dies ist ein schöner Kompromiss. Dies beruht auf Java-Varargs, und mein Code überprüft die Protokollierungsstufe und formatiert die Nachricht dann entsprechend. Das ist fast so schnell wie die Wachen, aber viel sauberer zu schreiben.

Jetzt loggen.DebugFormat kann eine ähnliche Sache tun, die ich nicht weiß.

Darüber hinaus, natürlich, ist die tatsächliche Kosten der Protokollierung (auf dem Bildschirm, in eine Datei, an eine Steckdose, etc.). Aber das sind nur Kosten, die Sie akzeptieren müssen. Meine beste Praxis dafür ist, wenn es praktikabel ist, die eigentlichen Protokollnachrichten an eine Warteschlange weiterzuleiten, die dann geerntet und über einen separaten Thread an den richtigen Kanal ausgegeben wird. Dies trägt zumindest dazu bei, das Abmelden von der Hauptrechenleistung fernzuhalten, aber es hat eigene Kosten und Komplexität.

3

Geben Sie einfach Will Hartung Antwort eine .NET-Perspektive :)

DebugFormat Code ist:

if (IsDebugEnabled) 
{ 
    Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null); 
} 

Im Grunde ist es das gleiche ist, so ist es meine Meinung, dass, wenn Sie DebugFormat Sie verwenden müssen nicht verwenden die Schutzklausel (Sie können immer noch einen kleinen Overhead haben, aber ich denke, es ist klein genug ignoriert zu werden)

einen Kommentar hinterlassen haben würde, aber ich habe nicht genug Ruf:/

Verwandte Themen