如何使用 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 {
}
}
}
另见:
答案 0 :(得分:49)
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);
}
答案 1 :(得分:10)
为什么不把异常放在记录器中?
您可以使用此方法:
logger.log(Level level, String msg, Throwable thrown)
答案 2 :(得分:8)
也许是一个重复的问题? Java - Need a logging package that will log the stacktrace
来自给定网址的解释
使用log4j 这是通过以下方式完成的:
logger.error("An error occurred", exception);
第一个参数是要显示的消息,第二个参数是 异常(throwable),其堆栈跟踪已记录。
另一种选择是公共记录, 它是一样的:
log.error("Message", exception);
java.util.logging
这可以通过以下方式完成:logger.log(Level.SEVERE, "Message", exception);
答案 3 :(得分:7)
您没有显式打印堆栈跟踪; Throwable
附加了堆栈跟踪,您可以将Throwable
传递给日志方法:
log(Level level, String msg, Throwable thrown)
答案 4 :(得分:4)
您可以使用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)**);
}
答案 5 :(得分:3)
您应该将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流重定向到记录器。
答案 6 :(得分:3)
答案 7 :(得分:1)
异常是由于printstacktrace
方法为void
,这意味着它不会返回任何内容。你正试图这样做:
log.severe(npe.printStackTrace(System.out));
我的猜测是severe
方法需要String
而非void
。