printStackTrace su java.util.logging.Logger


Answers

Perché non inserisci l'eccezione nel logger?

Puoi usare questo metodo:

logger.log(Level level, String msg, Throwable thrown) 
Question

Come posso stampare l'intera traccia dello stack usando java.util.Logger? (senza fastidiosi Netbeans).

La domanda avrebbe dovuto originariamente rimanere all'interno di Java SE. Omettere quella richiesta è stato un errore da parte mia.

-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

codice con l'errore:

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 {
        }
    }
}

Guarda anche:

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




Dovresti reindirizzare System.err al logger, il processo non è troppo semplice ma puoi usare questo codice:

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);
        }
    }
}

E il codice per impostare questo (che dovrebbe essere chiamato quando crei il logger per la prima volta

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

Ciò reindirizzerà il flusso System.err al registratore.




L'eccezione è dovuta al fatto che il metodo printstacktrace è void , il che significa che non restituisce nulla. Stai provando a fare:

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

La mia ipotesi è che il metodo severe bisogno di una String e non di void .




Forse una domanda duplicata? Java: richiede un pacchetto di registrazione che registri lo stacktrace

Sotto la spiegazione dall'URL indicato

Usando log4j questo è fatto con:

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

Il primo argomento è un messaggio da visualizzare, il secondo è l'eccezione (lanciabile) di cui viene registrato lo stacktrace.

Un'altra opzione è la registrazione commons, dove è la stessa:

log.error("Message", exception);

Con java.util.logging questo può essere fatto tramite:

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



Related