Custom Logging im Glassfish v3

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.