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.
Protokollieren Sie auf der Konsole, in einer Datei, in einer Datenbank? Das ist sehr wichtig für die Leistung. –