【问题标题】:printStackTrace to java.util.logging.LoggerprintStackTrace 到 java.util.logging.Logger
【发布时间】:2013-09-24 06:11:47
【问题描述】:

如何使用 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 {
        }
    }
}

另见:

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

【问题讨论】:

    标签: java nullpointerexception java.util.logging throwable printstacktrace


    【解决方案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);
    }
    

    【讨论】:

    • 这个答案的唯一问题是它相当冗长——但那是你的 Java!
    • 这是我第一次看到有人捕获 NP 异常!
    【解决方案2】:

    您可以使用 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)**);
     }
    

    【讨论】:

    • 您的解决方案帮助了我。另一种解决方法:logger.severe(Arrays.toString(e.getStackTrace()));
    【解决方案3】:

    你也可以尝试使用ExceptionUtils from apache commons

    【讨论】:

      【解决方案4】:

      异常是由于printstacktrace 方法为void,这意味着它不返回任何内容。你正在尝试做:

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

      我的猜测是severe 方法需要String 而不是void

      【讨论】:

        【解决方案5】:

        也许是重复的问题? Java - Need a logging package that will log the stacktrace

        在给定网址的解释下方

        使用 log4j 这是通过以下方式完成的:

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

        第一个参数是要显示的消息,第二个参数是 记录堆栈跟踪的异常(可抛出)。

        另一个选项是公共日志记录, 哪里一样:

        log.error("Message", exception);
        

        java.util.logging 这可以通过:

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

        【讨论】:

        • 这就是我要找的。谢谢。
        【解决方案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】:

          您没有显式打印堆栈跟踪; Throwables 附加了堆栈跟踪,您可以将 Throwable 传递给日志方法:

          log(Level level, String msg, Throwable thrown)
          

          【讨论】:

            【解决方案8】:

            为什么不将异常放入记录器中?

            你可以用这个方法:

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

            【讨论】:

            • 我认为这是达到预期结果的最简单方法。当然,必须尝试一下。
            猜你喜欢
            • 2016-12-18
            • 2010-10-09
            • 2016-03-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多