Ich bin mit neuesten Eclipse und Sonar-Plugin
In Antwort für die Anmeldung gibt es die folgende Zeile:
log.debug("Request body: {}", new String(body, "UTF-8"));
Welches String sollte nur, wenn in DEBUG Ebene erstellen:
/**
* Log a message at the DEBUG level according to the specified format
* and argument.
* <p/>
* <p>This form avoids superfluous object creation when the logger
* is disabled for the DEBUG level. </p>
*
* @param format the format string
* @param arg the argument
*/
public void debug(String format, Object arg);
Aber Sonar markiert es als squid:S2629
:
„Voraussetzungen“ und Protokollierung Argumente sollten nicht Auswertung erfordern (Tintenfisch: S2629)
Und geben Sie Beispiele mit Verkettung
logger.log (Level.DEBUG "ging etwas schief:" + message); // Nicht kompatibel; String-Verkettung durchgeführt, auch wenn Protokollebene zu hoch DEBUG Meldungen zu zeigen
Ist es ein falsch positives Sonar Warnung oder bin ich etwas fehlt?
Dies ist kein Duplikat dieser Frage , die im Allgemeinen über das Regel - Konzept verlangt, die Verkettung ist, aber nicht die Formatierung mit dem Objekt zu schaffen alsnew String
Auch Verknüpfung einer Antwort sagt zu schaffen new Date()
ist nicht ein Problem zu schaffen mit im Format aufgebaut:
public static void main(String[] args) { LOGGER.info("The program started at {}", new Date()); } }
Protokollieren diese Weise vermeiden Sie Performance-Overhead für Strings Verkettung wenn nichts sollte eigentlich eingeloggt sein.
In nicht-DEBUG-Modus der Leitung
log.debug("Request body: {}", new String(body, "UTF-8"));
Anstatt von
log.debug(MessageFormatter.format("Request body: {}", new String(body, "UTF-8")));
vermeidet die Erzeugung der Zeichenfolge , die über erstellt wird MessageFormatter.format(String messagePattern, Object arg)
, aber nicht die Schaffung der anderen Zeichenfolge, die erstellt wird new String(body, "UTF-8")
.
Dies bedeutet , es ist nicht falsch positiv , weil die Argumente zuerst berechnet werden , bevor die Protokollierung - Methode aufgerufen wird.
Solange SLF4J nicht Lambda - Ausdruck unterstützt zu faul Argumente zu bewerten (siehe Kommentar von ZhekaKozlov ) kann die folgende Dienstprogramm Methode als Behelfslösung verwendet werden:
private static Object lazyToString(final Supplier<String> stringSupplier) {
return new Object() {
@Override
public String toString() {
return stringSupplier.get();
}
};
}
Dies kann das Umwandeln des Byte-Arrays in einen String in den DEBUG-Modus zu beschränken, nur dann verwendet werden:
log.debug("Request body: {}", lazyToString(() -> new String(body, StandardCharsets.UTF_8)));
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen