web-dev-qa-db-ja.com

Java Loggerクラスを使用してスタックトレースを記録する方法

JavaのLoggerクラスを使用しています。 ex.printStackTrace()Logger.log(loglevel, String)に渡したいのですが、printStackTrace()voidを返します。そのため、例外のスタックトレースを渡して印刷することはできません。

voidStringに変換する方法はありますか、または例外のスタックトレース全体を出力する他の方法はありますか?

19
Surya Joseph

voidは実際にはnothingnessであることを理解する必要があります。何も変換できません。 voidを文字列として印刷することになるかもしれませんが、(私を信じて)、あなたはそれを望んでいません。

あなたが探しているのは

// assuming ex is your Exception object
logger.error(ex.getMessage(), ex);
// OR
Logger.log(errorLogLevel, ex.getMessage(), ex)

これにより、設定したロガーを使用してエラーメッセージが出力されます。詳細については、Java Exception#getMessage() のドキュメントをご覧ください。

30
Saif Asif

Java.util.logging.Logger#log(Level, String, Throwable)を使用し、exを3番目の引数として次のように渡します。

LOGGER.log(Level.INFO, ex.getMessage(), ex);
17
hzpz

また、別の選択肢は次のとおりです。

import org.Apache.commons.lang3.exception.ExceptionUtils;

log.error("Exception : "+ExceptionUtils.getFullStackTrace(e));
6
Rutuja

voidStringに変換することはできません。そのような変換は存在しません。 voidanythingを返さないため、取得する値はありません。

おそらくやりたいことは、代わりに ex.getMessage() を使用して例外のメッセージを取得することです。

6
Makoto

getStackTrace() メソッドを使用してStackTraceElementsの配列を取得し、そこから文字列を生成できます。それ以外の場合、最後のエラーメッセージだけで十分な場合は、Makotoが提案するgetMessage()メソッドを使用します。

Stringオブジェクトの配列からStackTraceElementとしてスタックトレースを取得するには、配列を反復処理する必要があります(JDK7ソースから取得)。

_StringBuilder builder = new StringBuilder();
StackTraceElement[] trace = getOurStackTrace();
    for (StackTraceElement traceElement : trace)
        builder.append("\tat " + traceElement + "\n");
_

別のオプションは、printStackTrace(PrintStream s)を使用することです。ここで、スタックトレースを印刷する場所を指定できます。

_ByteArrayOutputStream out1 = new ByteArrayOutputStream();
PrintStream out2 = new PrintStream(out1);
ex.printStackTrace(out2);
String message = out1.toString("UTF8");
_
2

以下の形式を使用すると、スタックトレースを取得できます。

Java.util.logging.SimpleFormatter.format=%1$tF %1$tT [%4$-7s][%2$s] %5$s %6$s%n

このパターンのポイントは%6 $ sです。スタックトレースを出力します。

0
iman

皆さん、ありがとうございました。を使用してスタックトレースの詳細を記録できます。

LOGGER.log(Level.INFO, ex.getMessage(),ex);
//ex is my exception object
0
Surya Joseph

マコトが言うように、おそらくex.getMessage()を実行したいでしょう。

さらに明確にするため、voidは何も返されないことを意味します。何にもキャストできません:)

0
kotakotakota

以下を使用してスタックトレースを文字列に変換できます。 eが例外オブジェクトの場合

StringWriter stringWriter= new StringWriter();
PrintWriter printWriter= new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
String stackTraceAsString= stringWriter.toString(); 
0
Amit.rk3

PrintWriterを受け取るオーバーロードされたprintStackTraceメソッドがあります。

このようなことができます

Writer buffer = new StringWriter();
PrintWriter pw = new PrintWriter(buffer);
ex.printStackTrace(pw);
Logger.log(loglevel, buffer.toString());
0
sleeloy