So, heute habe ich mich mit der internen Logging-Bibliothek von Java rumgeaergert. Aber fangen wir mal von vorne an. In meinem Praxissemester programmiere ich gerade ein paar Perfomancemessungen in ein Applet ein. Prinzipiell ein simpler Arbeitsgang, aber ich wollte jetzt halt gleich alles ’schoen‘ machen. Nachdem mich ein Freund darauf hingewiesen hat das System.out.println() doch nicht das Wahre ist („fooo, lame, nutz nen Loggingframework. FTW!!!!11einself“), habe ich mich jetzt fuer java.util.logging entschieden. Kann genau das was ich will. Gut, also angefangen:
package foo;
import java.util.logging.*;
public class PerformanceDebug {
private static Logger logger = Logger.getLogger("foo.PerformanceDebug");
public PerformanceDebug() {
Handler handler = new ConsoleHandler();
handler.setLevel(Level.FINE);
logger.addHandler(handler);
logger.setLevel(Level.ALL);
foobar();
}
public void foobar() {
logger.info("Hello World");
}
}
Gut. Oder auch nicht, hat naemlich nicht funktioniert. Hat irgendwelche PermissionExceptions geschmissen. Bissle Recherche: Applets laufen in einem beschraenktem Modus, d.h. sie duerfen z.B. nicht irgendwohin schreiben, z.B. mit dem ConsoleHandler. Aber gut, weitere Recherche ergab, dass ich den ConsoleHandler auch weglassen kann, dann schreibt er einfach nach STDOUT, d.h. in die Java Console. Gut.
package foo;
import java.util.logging.*;
public class PerformanceDebug {
private static Logger logger = Logger.getLogger("foo.PerformanceDebug");
public PerformanceDebug() {
logger.setLevel(Level.ALL);
foobar();
}
public void foobar() {
logger.info("Hello World");
}
}
Jop, hat erstmal nix gebracht, immer noch Fehlermeldungen (kompilieren tut das uebrigens alles prima). Der ConsoleHandler war gar nicht das einzige Problem, im Applet funktioniert auch Logger.getLogger(„package.class“) nicht. Aber dafuer gibts dann ja Logger.getAnonymousLogger().
package foo;
import java.util.logging.*;
public class PerformanceDebug {
private static Logger logger = Logger.getAnonymousLogger();
public PerformanceDebug() {
logger.setLevel(Level.ALL);
foobar();
}
public void foobar() {
logger.info("Hello World");
}
}
Wieder einen Schritt weiter und immer noch nicht am Ziel. Jetzt laeuft es zwar im Applet, aber die Ausgabe ist haesslich (im Sinne von: Ich mag sie nicht :)). Aber dafuer gibts ja java.util.logging.Formatter, damit kann man eigene Formate schreiben. Also flugs eine Subklasse verfasst:
package foo;
import java.util.logging.*;
public class PerformanceDebug {
private static Logger logger = Logger.getAnonymousLogger();
public PerformanceDebug() {
logger.setLevel(Level.ALL);
foobar();
}
public void foobar() {
logger.info("Hello World");
}
public class FooFormatter extends Formatter {
public String format(LogRecord record) {
return "Foo:"
+ record.getMessage()
+ "\n";
}
}
}
Das klappt in jeder Standalone-Applikation und im Applet Viewer, aber im Applet selber gehts wieder nicht. Ein Spass mit den Sicherheitsbeschraenkungen von Applets, da wird das Laden des Formatters einfach unterbunden und eine Exception geschmissen. Also kann ich nicht das machen was ich will. Und Sun hat sich wohl gedacht das man in Applets keine eigenen Formatter braucht. Applets sind eh tot. Genau. Naja, so bringt man auch nen Tag rum, mit wilden Rumprobieren, googlen und fluchen. In diesem Sinne. Feierabend fuer heute.