Hier sind zwei Aussagen, die allgemein akzeptiert zu sein scheinen, aber das kann ich wirklich nicht verwinden:Parametrisierte Protokollierung in slf4j - wie wird es mit den Parametern von scala verglichen?
1) Scala by-Name params anmutig ersetzt das immer so ärgerlich log4j Nutzungsmuster:
if (l.isDebugEnabled()) {
logger.debug("expensive string representation, eg: godObject.toString()")
}
, da der By-Name-Parameter (eine Scala-spezifische Sprachfunktion) nicht vor dem Methodenaufruf ausgewertet wird.
logger.debug("expensive string representation, eg {}:", godObject[.toString()]);
Also, wie funktioniert das:
2) Jedoch wird dieses Problem durch parametrisierte Protokollierung in slf4f gelöst? Gibt es in der Bibliothek slf4j eine Low-Level-Magie, die die Auswertung des Parameters vor der Ausführung der "Debug" -Methode verhindert? (Ist das überhaupt möglich? Kann eine Bibliothek solch einen fundamentalen Aspekt der Sprache beeinflussen?)
Oder ist es einfach die einfache Tatsache, dass ein Objekt an die Methode übergeben wird - und nicht ein String? (und möglicherweise wird toString() dieses Objekts in der debug() -Methode selbst aufgerufen, falls zutreffend).
Aber stimmt das nicht auch für log4j? (Es hat Methoden mit Objektparametern). Und würde das nicht bedeuten, dass, wenn Sie eine Zeichenfolge übergeben - wie im obigen Code - würde es sich identisch mit log4j verhalten?
Ich würde wirklich gerne etwas Licht in diese Angelegenheit werfen.
Danke!
Kristallklar, vielen Dank. Ich schätze, deine gründliche Erklärung gleicht die Magie aus, auf die ich gehofft hatte und die ich nicht bekommen habe. :) – teo