web-dev-qa-db-ja.com

printStackTraceからJava.util.logging.Loggerへ

Java.util.Loggerを使用してスタックトレース全体を印刷する方法using (迷惑なNetbeansなし)。

質問は、元々、withinJava SE。私の側のエラー。

-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

エラーのあるコード:

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

こちらもご覧ください:

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

32
Thufir

severeメソッドは、スロー可能な情報が関連付けられていない重大なメッセージを記録するためにのみ使用されます。スロー可能な情報を記録する必要がある場合は、代わりにlogメソッドを使用する必要があります。

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

ロガーに例外を入れてみませんか?

このメソッドを使用できます:

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

たぶん重複した質問ですか? Java-スタックトレースを記録するログパッケージが必要

指定されたURLの説明の下

Log4jを使用すると、これは次のように行われます。

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

最初の引数は表示されるメッセージで、2番目はスタックトレースがログに記録される例外(スロー可能)です。

別のオプションはcommons-loggingで、同じ場合です:

log.error("Message", exception);

Java.util.loggingこれは次の方法で実行できます。

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

スタックトレースを明示的に出力することはありません。 Throwablesにはスタックトレースがアタッチされており、Throwableをログメソッドに渡すことができます。

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

Apache ExceptionUtilsを使用できます。あなたの場合

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

Apache commonsのExceptionUtils を使用することもできます。

3
KrzyH

System.errをロガーにリダイレクトする必要があります。プロセスは単純ではありませんが、次のコードを使用できます。

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

そして、これを設定するコード(ロガーを最初に作成するときに呼び出す必要があります)

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

これにより、System.errストリームがロガーにリダイレクトされます。

3
Gianmarco

例外は、 printstacktrace メソッドがvoidであるためです。つまり、何も返されません。あなたがしようとしている:

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

私の推測では、severeメソッドにはStringではなくvoidが必要です。

1
Sajan Chandran