Un petit bout de code utile pour tout programme de type démon/serveur et qui permet d’enregistrer dans un fichier journal (cf. API java.util.logging) toute exception non gérée, en particulier avec son stacktrace complet, tel que Java le produirait en console :

private final static Logger m_logger = Logger.getLogger ("package.MyClass");

try
{
    [...]
}
catch (Exception exception)
{
    StringBuilder stackTrace = new StringBuilder ("exception during execution: " +
        exception.getMessage ());

    for (StackTraceElement element : exception.getStackTrace ())
    {
        stackTrace.append ("\n\tat " + element.getClassName ()
                + ":" + element.getMethodName () + "("
                + element.getFileName () + ":"
                + element.getLineNumber () + ")");
    }

    m_logger.log (Level.SEVERE, stackTrace.toString ());
}

Exemple de sortie :

2 mai 2009 18:51:26 fr.hbis.ircs.Client parse
GRAVE: exception during command execution 'JOIN': fr.hbis.ircs.Channel.create(Ljava/lang/String;
Ljava/lang/String;)Lfr/hbis/ircs/Channel;
at fr.hbis.ircs.commands.Join:doCommand(Join.java:130)
at fr.hbis.ircs.commands.Join:execute(Join.java:64)
at fr.hbis.ircs.Client:parse(Client.java:158)
at fr.hbis.ircs.Client:read(Client.java:127)
at fr.hbis.ircs.nio.MessageTask:doProcess(MessageTask.java:253)
at fr.hbis.ircs.nio.MessageTask:doRead(MessageTask.java:197)
at fr.hbis.ircs.nio.MessageTask:doTask(MessageTask.java:152)
at fr.hbis.ircs.lib.nio.task.TaskBase:run(TaskBase.java:102)
at java.util.concurrent.ThreadPoolExecutor$Worker:runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker:run(ThreadPoolExecutor.java:907)
at fr.hbis.ircs.lib.nio.worker.DefaultWorkerThread:run(DefaultWorkerThread.java:123)

Sympa, on en perd plus une miette.