2009-12-23 16 views
24

ich dieses viel loswerden wollen ...Gibt es noch eine Java 1.5 varargs API für slf4j?

public void info(String msg); 
public void info(String format, Object arg); 
public void info(String format, Object arg1, Object arg2); 
public void info(String format, Object[] argArray); 

... und ersetzen Sie es durch dieses ...

public void info(String format, Object ... args); 

... so, dass meine Logging-Syntax nicht der Fall ist müssen sich abhängig von der Anzahl der Argumente ändern, die ich protokollieren möchte. Es scheint viel zu diskutieren und zu arbeiten, aber wo ist es? Oder sollte ich den Wrapper, der slf4j ist, einpacken?

+3

Wenn ein Open-Source-Projekt Ihre Patches nicht akzeptiert und Sie die bestimmte Funktionalität benötigen, dann erscheint die Antwort ziemlich offensichtlich, nein? – kdgregory

+0

@ kdgregory - nein, nicht offensichtlich und nicht wie es funktionieren sollte; das ist eine kommerzielle (fatalistische) Denkweise, wobei software = vendor.pay(). requestFeature(). receiveUpgrade(); if catch UnsupportedException, es ist neu Vendor() || self.screwed(). Aber openSource = public.download(). Use(). RequestFeature(). AwarnUntil (public.getConsensus()); Wenn Konsens <= Kosten (in Zeit oder $$), sollte es sich lohnen. Ein Großteil meiner Zeit (als kommerzieller SW-Entwickler) wird für die Umsetzung von schlecht konzipierten Verbesserungen aufgewendet, die nicht vom Konsens/gesunden Menschenverstand motiviert sind, sondern von dollars.received(). Ich erwarte auch, dass dies beibehalten wird, was zu zukünftigen Kosten beiträgt. – michael

+0

@michael_n - nicht sicher, wie Sie meinen Kommentar interpretiert haben, aber die offensichtliche Antwort ist "mach eine Gabelung". Es ist schön, wenn die Projektbetreuer die gleichen Dinge wollen wie du, aber das passiert nicht immer. – kdgregory

Antwort

4

Aus dem Lesen der SLF4J Javadoc für Logger würde die einfache Antwort scheinen nein zu sein. Nach dem, was ich gelesen habe, wollen sie mit älteren Versionen des JDK kompatibel bleiben.

Wenn Sie nicht wirklich an die Verwendung von SLF4J gebunden sind, dann ist vielleicht log5j eine Option?

+1

+1 für die log5j-Referenz - klingt ordentlich! –

+0

Nein, sie wollen binär kompatibel mit älteren Versprechungen von slf4j bleiben. –

14

Die eigentliche Frage ist: „Warum muss ein jdk < 5 werden unterstützt durch diese nicht mehr“ zu sehen? Wenn Sie eine ältere Version von Java haben, verwenden Sie die ältere API. So einfach ist das. Warum passt das nicht besser in die aktuelle Java-Welt? Ich meine, JDK 5 wird nicht einmal ohne einen Supportvertrag von Sun/Oracle unterstützt. Rückwärtskompatibilität ist in diesem Fall ein Witz.

+1

Unterstützung hängt von der Plattform ab. IBM unterstützt 1.4 ón ihre Plattformen. –

+0

Oh, und du antwortest auf "warum muss ..." ist, dass Ceki, der gütige Diktator, will, dass es so ist. –

+2

Ich verstehe es nicht ... warum nicht Slf4j 2.x, das mit Java 5 kompatibel ist, und halten Slf4j 1.x kompatibel mit Java 0.0.1? – rustyx

5

Was dazu:

package util; 

public class Util { 
    public static Object[] va(Object... args) { 
    return args; 
    } 
} 

package foo; 
import static util.Util.va; 
... 
logger.info("a {}, b {}, c c {}", va("A", "B", "C")); 
... 

Sie zu va() an anderen Orten nutzen können.

1

Es gibt eine Lösung, varargs mit SLF4J zu verwenden.

Es gibt ein Open-Source-Projekt namens Lumberjack, das SLF4J erweitert, um varargs-Protokollierungsmethoden bereitzustellen. Die Erweiterung ist sehr natürlich, Sie spüren keinen Unterschied zu SLF4J (weil Lumberjack nur ein Wrapper um SLF4J ist, so dass alle Funktionen von SLF4J zur Verfügung gestellt werden).

Beispiel Nutzung:

JackLogger logger = JackLoggerFactory.getLogger(LoggerFactory.getLogger(Weather.class)); 

logger.info("Hello {}! The current time is {}:{}:{}, and after {} hours the weather will be {}.", "Jack", 13, 30, 0, 5, "sunny"); 

Lumberjack Webseite: https://github.com/bogdanu/lumberjack

Die Lumberjack-Lizenz ist die gleiche wie SLF4J Führerschein, der MIT-Lizenz, so dass es keine zusätzliche Lizenzbeschränkung.

Disclaimer: Ich bin der Autor des Lumberjack

0

jcabi-log Toolkit Versuchen Sie, die SLF4J mit einer conveninent Vararg Schnittstelle Anmeldung umschließt.

11

Dies ist endlich gelöst. SLF4J 1.7.0 benötigt jetzt JDK 1.5 und verfügt über abwärtskompatible varargs-Methoden.