Im Glassfish v3 nutzt als Standard Logging Framework das JDK-Logging.
Alle Logausgaben landen dabei im server.log der entsprechenden
Domain. Der Artikel beschreibt das Erzeugen eines eigenes Loglevel (z.B.
fachliches Logging in eine separate Logdatei / Datenbank) und wie dieses
im Glassfish v3 integriert werden kann.
Eigene Loglevel - Klasse, welche von java.util.logging.Level
erben muss.
Das neue Loglevel nutzt die Order-Number des INFO Loglevels, kann
aber beliebig gesetzt werden.
package de.ronnyfriedland.jdk.level; import java.util.logging.Level; /** * Eigenes Loglevel (z.B. für fachliches Logging). */ public class CustomLevel extends Level { /** * Das LogLevel */ public static final Level CUSTOM = new CustomLevel("CUSTOM", Level.INFO.intValue()); /** * Erzeugt eine neue CustomLevel-Instanz. * * @param name Name des Loglevels * @param value Wert */ public CustomLevel(String name, int value) { super(name, value); } }
Soweit so gut - prinzipiell wäre es jetzt schon möglich, dieses Loglevel zu nutzen. Die Klasse muss sich dafür im Classpath befinden. Dafür muss ein JAR mit der Loglevel - Klasse erzeugt und in das Verzeichnis lib/ext der Domain gespeichert werden.
Die Logmeldungen werden über den Default-Handler des Glassfish in das Logfile geschrieben. Sofern man dies ändern möchte, wird eine eigene Handler - Implementierung benötigt.
package de.ronnyfriedland.jdk.handler; import java.io.FileWriter; import java.io.IOException; import java.util.logging.Handler; import java.util.logging.LogRecord; import de.ronnyfriedland.jdk.level.CustomLevel; /** * Eigene {@link Handler} Implementierung, welche die Daten in eine Datei schreibt. Theoretisch kann hier ganz * individuell festgelegt werden, wann und wohin geschrieben wird. */ public class CustomLogHandler extends Handler { /** * Die Logdaten sollen über einen {@link FileWriter} geschrieben werden. */ private transient final FileWriter fileWriter; /** * Erzeugt eine neue CustomLogHandler-Instanz. */ public CustomLogHandler() { super(); try { fileWriter = new FileWriter("/var/log/customlogging.log"); } catch (IOException ex) { throw new RuntimeException("CustomLogHandler konnte nicht initialisiert werden.", ex); } } /** * {@inheritDoc} * * @see java.util.logging.Handler#publish(java.util.logging.LogRecord) */ @Override public void publish(LogRecord record) { if (null != getFilter() && getFilter().isLoggable(record)) { try { if (record.getLevel() instanceof CustomLevel) { StringBuffer sb = new StringBuffer(); sb.append(String.format("%s : ", record.getLevel().getName())); sb.append(String.format("%st", record.getMessage())); sb.append(String.format("%sn", record.getThrown())); fileWriter.write(sb.toString()); } } catch (IOException ex) { ex.printStackTrace(); } } } /** * {@inheritDoc} * * @see java.util.logging.Handler#close() */ @Override public void close() { try { fileWriter.close(); } catch (IOException ex) { ex.printStackTrace(); } } /** * {@inheritDoc} * * @see java.util.logging.Handler#flush() */ @Override public void flush() { try { fileWriter.flush(); } catch (IOException ex) { ex.printStackTrace(); } } }
Diese Klasse wird mit in das JAR verpackt, welches im lib/ext
Verzeichnis der Domain liegt.
Damit die Handler - Klasse auch aktiv wird, muss diese in der
config/logging.properties eingetragen werden:
handlers=de.ronnyfriedland.jdk.handler.CustomLogHandler,java.util.logging.ConsoleHandler
Alle Logausschriften über das neue Loglevel erscheinen nun - neben dem Standard server.log - in der im Handler angegebenen Ausgabedatei.