PrintStackTrace - java.util.logging.Logger
Как распечатать всю трассировку стека с помощью java.util.Logger? (без раздражающих Netbeans).
Вопрос должен был первоначально указывать на внутри Java 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 {
}
}
}
см. также:
qaru.site/info/107983/...
Ответы
Ответ 1
Метод 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);
}
Ответ 2
Почему вы не помещаете исключение в регистратор?
Вы можете использовать этот метод:
logger.log(Level level, String msg, Throwable thrown)
Ответ 3
Вы явно не печатаете трассировку стека; Throwable
имеют прикрепленные к ним трассировки стека, и вы можете передать Throwable
методам журнала:
log(Level level, String msg, Throwable thrown)
Ответ 4
Возможно, дублированный вопрос? Java - нужен пакет протоколирования, в который будет входить файл stacktrace
Ниже объяснения от данного URL
Использование log4j это делается с помощью:
logger.error("An error occurred", exception);
Первый аргумент - это отображаемое сообщение, второе - исключение (throwable), чья стопка стека записывается в журнал.
Другим вариантом является сбор данных, где он то же самое:
log.error("Message", exception);
С java.util.logging
это можно сделать с помощью:
logger.log(Level.SEVERE, "Message", exception);
Ответ 5
Вы можете использовать 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)**);
}
Ответ 6
Вы должны перенаправить 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 в журнал.
Ответ 7
Вы также можете попытаться использовать ExceptionUtils из сообщества apache
Ответ 8
Исключение связано с тем, что printstacktrace
метод void
, что означает, что он ничего не возвращает. Вы пытаетесь сделать:
log.severe(npe.printStackTrace(System.out));
Я предполагаю, что для метода severe
требуется String
, а не void
.