Frage

Ich bin ein großer Fan von log4net , aber in letzter Zeit haben einige (in meiner Abteilung) in Frage gestellt die Aufnahme in unseren Projekten wegen der scheinbar Schwere jeder Protokollierungsmethode. Ich würde behaupten, dass es bessere Techniken als andere, aber das ist eine andere Frage.

Ich bin neugierig zu wissen, was ist die typische Wirkung eines log4net DebugFormat-Typ Anruf auf Ihre Anwendungen. Ich werde Variablen wie Anzahl der Log-Anweisungen auszulassen pro Codezeilen, etc, weil ich gerade bin auf der Suche nach etwas, das Sie in der realen Welt gesehen haben.

Und ich bin mir der einfachen Technik einer Schutzklausel langen Auswertung Aussagen des Hinzufügens eines Beispiel:

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

Also, lassen wir das jetzt von der Betrachtung ausgeschlossen werden.

War es hilfreich?

Lösung

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

Aber die Kosten für die Protokollierung ist wirklich in zwei Bereichen.

Die erste ist die Protokollierung Anruf, und das zweite ist die tatsächliche Beharren der Log-Informationen.

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

Wenn Sie jedoch Wachen nicht verwenden, können die Kosten auch der Preis werden die tatsächlichen Protokollierung Argumente zu schaffen.

Zum Beispiel in log4j, das war ein gemeinsames Idiom:

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, unabhängig von der Protokollebene, dass die Expression und der resultierenden Zeichenfolge erstellt werden. Stellen Sie sich vor, wenn stattdessen hat man so etwas wie:

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

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

Die Wächter:

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

beseitigt dieses Problem, 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());

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

Nun log.DebugFormat kann auch eine ähnliche Sache tun, dass ich nicht weiß.

Am Anfang dieser, natürlich, ist die tatsächlichen Kosten (auf dem Bildschirm, in eine Datei, an eine Steckdose usw.) anzumelden. Aber das ist nur ein Kosten Sie akzeptieren müssen. Meine beste Praxis, dass bei praktisch, die tatsächlichen Protokollnachrichten in eine Warteschlange zu routen, die dann und Ausgabe auf den richtigen Kanal geerntet wird einen separaten Thread verwendet wird. Dies zumindest hilft, die Protokollierung zu halten aus der Reihe mit dem Haupt Computing, aber es hat Kosten und die Komplexität ihres eigenen.

Andere Tipps

Ich weiß, dass dies ein alter Thread ist, aber wie wäre es ein Ansatz, der mit dem Code vermeidet Füllung, wenn Aussagen, die auf Protokollebene, wie diese: http://www.beefycode.com/post/Extension- Methods for Latente-Nachricht-Formatierung-in-Log4Net.aspx

Lambda-Ausdruck Mit der Nachricht zu erstellen, können Sie vermeiden es sogar vollständig zu bewerten.

Die log4net FAQ hat eine Antwort auf diese , wenn auch nicht in dem Detaillierungsgrad Sie suchen.

Zusammengefasst:., Diese Wache Klauseln verwenden

Just Giving 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, so ist es meine Meinung, dass, wenn Sie DebugFormat Sie nicht verwenden, die Schutzklausel verwenden müssen (Sie noch einen kleinen Overhead haben, aber ich denke, es ist klein genug, um ignoriert zu werden)

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top