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.