web-dev-qa-db-fra.com

printStackTrace à Java.util.logging.Logger

Comment imprimer l'intégralité de la trace de la pile à l'aide de Java.util.Logger? (sans Netbeans ennuyeux).

La question aurait dû spécifier à l'origine rester dans Java SE. Omettre cette exigence était une erreur sur ma part.

-do-compile:
    [mkdir] Created dir: /home/thufir/NetBeansProjects/rainmaker/build/empty
    [mkdir] Created dir: /home/thufir/NetBeansProjects/rainmaker/build/generated-sources/ap-source-output
    [javac] Compiling 13 source files to /home/thufir/NetBeansProjects/rainmaker/build/classes
    [javac] /home/thufir/NetBeansProjects/rainmaker/src/model/TelnetEventProcessor.Java:44: error: 'void' type not allowed here
    [javac]                 log.severe(npe.printStackTrace(System.out));
    [javac]                                               ^
    [javac] 1 error

BUILD FAILED

code avec l'erreur:

package model;

import Java.util.Observable;
import Java.util.logging.Logger;
import Java.util.regex.Matcher;
import Java.util.regex.Pattern;

public class TelnetEventProcessor extends Observable {

    private static Logger log = Logger.getLogger(TelnetEventProcessor.class.getName());
    private String string = null;

    public TelnetEventProcessor() {
    }

    private void stripAnsiColors() {
        Pattern regex = Pattern.compile("\\e\\[[0-9;]*m");
        Matcher regexMatcher = regex.matcher(string);
        string = regexMatcher.replaceAll(""); // *3 ??
    }

    public void parse(String string) {
        this.string = string;
        ifs();
    }

    //       [\w]+(?=\.) 
    private void ifs() {
        log.fine("checking..");
        if (string.contains("confusing the hell out of")) {
            Pattern pattern = Pattern.compile("[\\w]+(?=\\.)");  //(\w+)\.
            Matcher matcher = pattern.matcher(string);
            String enemy = null;
            GameData data = null;
            while (matcher.find()) {
                enemy = matcher.group();
            }
            try {
                data = new GameData.Builder().enemy(enemy).build();
                log.fine("new data object\t\t" + data.getEnemy());
                setChanged();
                notifyObservers(data);
            } catch (NullPointerException npe) {
                log.severe(npe.printStackTrace(System.out));
            }

        } else if (string.contains("Enter 3-letter city code:")) {
            log.fine("found enter city code");
        } else {
        }
    }
}

voir également:

https://stackoverflow.com/a/7100975/262852

32
Thufir

La méthode severe est uniquement utilisée pour consigner les messages graves sans informations jetables associées. Si vous devez enregistrer des informations jetables, vous devez utiliser la méthode log à la place:

try {
     data = new GameData.Builder().enemy(enemy).build();
     log.fine("new data object\t\t" + data.getEnemy());
     setChanged();
     notifyObservers(data);
} catch (NullPointerException npe) {
     log.log(Level.SEVERE, npe.getMessage(), npe);
}
50
M. Abbas

Pourquoi ne mettez-vous pas l'exception dans l'enregistreur?

Vous pouvez utiliser cette méthode:

logger.log(Level level, String msg, Throwable thrown) 
10
Michael Laffargue

Peut-être une question en double? Java - Besoin d'un package de journalisation qui enregistrera la trace de pile

Ci-dessous l'explication de l'url donnée

En utilisant log4j, cela se fait avec:

logger.error("An error occurred", exception);

Le premier argument est un message à afficher, le second est l'exception (jetable) dont la trace de pile est enregistrée.

Une autre option est la journalisation des communs, où c'est la même chose:

log.error("Message", exception);

Avec Java.util.logging cela peut se faire via:

logger.log(Level.SEVERE, "Message", exception);
9
Emanuele

Vous n'imprimez pas explicitement la trace de pile; Throwables ont des traces de pile attachées et vous pouvez passer un Throwable aux méthodes de journalisation:

log(Level level, String msg, Throwable thrown)
7
chrylis

Vous pouvez utiliser Apache ExceptionUtils. Dans ton cas

try {
     data = new GameData.Builder().enemy(enemy).build();
     log.fine("new data object\t\t" + data.getEnemy());
     setChanged();
     notifyObservers(data);
 } catch (NullPointerException npe) {
     logger.info(**ExceptionUtils.getFullStackTrace(npe)**);
 }
4
RIP_SunMicroSys

Vous pouvez également essayer d'utiliser ExceptionUtils from Apache commons

3
KrzyH

Vous devez rediriger le System.err vers l'enregistreur, le processus n'est pas trop simple mais vous pouvez utiliser ce code:

import Java.io.ByteArrayOutputStream;
import Java.io.IOException;
import Java.util.logging.Level;
import Java.util.logging.Logger;

public class LogOutputStream extends ByteArrayOutputStream {//Java.io.OutputStream {

    private String  lineSeparator;
    private Logger  logger;
    private Level   level;

    public LogOutputStream(Logger logger, Level level) {
        super();
        this.logger = logger;
        this.level = level;
        this.lineSeparator = System.getProperty("line.separator");
    }

    @Override
    public void flush() throws IOException {

        String record;
        synchronized (this) {
            super.flush();
            record = this.toString();
            super.reset();

            if ((record.length() == 0) || record.equals(this.lineSeparator)) {
                // avoid empty records 
                return;
            }

            this.logger.logp(this.level, "", "", record);
        }
    }
}

Et le code pour définir cela (qui devrait être appelé lors de la première création de l'enregistreur

Logger logger = Logger.getLogger("Exception");
LogOutputStream los = new LogOutputStream(logger, Level.SEVERE);
System.setErr(new PrintStream(los, true));

Cela redirigera le flux System.err vers l'enregistreur.

3
Gianmarco

L'exception est due à la méthode printstacktrace étant void, ce qui signifie qu'elle ne renvoie rien. Vous essayez de faire:

log.severe(npe.printStackTrace(System.out));

Je suppose que la méthode severe a besoin d'un String et non void.

1
Sajan Chandran