web-dev-qa-db-ja.com

完全なスタックトレースをログに書き込むにはどうすればよいですか?

例外をキャッチしてスタックトレースを次のようにログに書き込もうとしました。

log.warn(e.getMessage());

しかしそれが言ったすべては

null

だから私はそれを

log.warn(e.toString());

そして今それだけが言う

Java.lang.NullPointerException

この例外がアプリのどこで生成されているかを確認できるように、完全なスタックトレースをログに書き込むにはどうすればよいですか?

19
Linc

通常:

log.warn("message", e);

ただし、それはロギングフレームワークにも依存します。

34

使用できます

logger.log(Level.WARN, "logged exception", ex);

または

logger.warn("logged exception", ex);

リソース:

9
Colin Hebert

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

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

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

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

log.error("Message", exception);

Java.util.loggingを使用すると、これは次のように実行できます。

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

Java8を使用している場合は、次のことができます。

        LOGGER.error("Caught exception while methodX. Please investigate: " 
                + exception 
                + Arrays.asList(exception.getStackTrace())
                .stream()
                .map(Objects::toString)
                .collect(Collectors.joining("\n"))
        );
3
nishant

例外メソッドでは、メッセージを含む基礎となるStringnullです。

上記の答えは、現在取り消し済みですが、eがnullではないが、detailMessageクラスのThrowableプライベートインスタンス変数がnullであることを除いて、保持されています。これがe.getMessage()の理由です。文字列nullですが、e.toString()(基になるnulldetailMessage.toStringを呼び出す)はNullPointerExceptionをスローします。

3
Noel M

多分あなたはこのようなものを探しています: http://www.javapractices.com/topic/TopicAction.do?Id=78

1
Joelio

Java 8より前のバージョンを使用している場合は、これを試すことができます。

            LOGGER.error("Error al recuperar proveedores de la base de datos: " + 
            e + Arrays.asList(e.getStackTrace()).stream().map(new Function(){
                    @Override
                    public Object apply(Object t) {
                        return t.toString();
                    }
                }).collect(Collectors.joining("\n")));
0
RafaJR