[java] stacktrace를 log4j로 보내는 방법은 무엇입니까?



Answers

예외를 수반하지 않고 스택 추적을 기록하려면 다음을 수행하십시오.

String message = "";

for(StackTraceElement stackTraceElement : Thread.currentThread().getStackTrace()) {                         
    message = message + System.lineSeparator() + stackTraceElement.toString();
}   
log.warn("Something weird happened. I will print the the complete stacktrace even if we have no exception just to help you find the cause" + message);
Question

e.printStackTrace () 를 수행하면 예외를 잡아서 표준 출력 (예 : 콘솔)에서 다음을 얻습니다.

java.io.FileNotFoundException: so.txt
        at java.io.FileInputStream.<init>(FileInputStream.java)
        at ExTest.readMyFile(ExTest.java:19)
        at ExTest.main(ExTest.java:7)

이제 대신 log4j와 같은 로그 작성기로 보내서 다음을 얻으려고합니다.

31947 [AWT-EventQueue-0] ERROR Java.io.FileNotFoundException: so.txt
32204 [AWT-EventQueue-0] ERROR    at java.io.FileInputStream.<init>(FileInputStream.java)
32235 [AWT-EventQueue-0] ERROR    at ExTest.readMyFile(ExTest.java:19)
32370 [AWT-EventQueue-0] ERROR    at ExTest.main(ExTest.java:7)

어떻게해야합니까?

try {
   ...
} catch (Exception e) {
    final String s;
    ...  // <-- What goes here?
    log.error( s );
}



Try this:

catch (Throwable t) {
    logger.error("any message" + t);
    StackTraceElement[] s = t.getStackTrace();
    for(StackTraceElement e : s){
        logger.error("\tat " + e);
    }   
}



이 답변은 질문과 관련이 없지만 질문의 제목과 관련이있을 수 있습니다.

public class ThrowableTest {

    public static void main(String[] args) {

        Throwable createdBy = new Throwable("Created at main()");
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        PrintWriter pw = new PrintWriter(os);
        createdBy.printStackTrace(pw);
        try {
            pw.close();
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        logger.debug(os.toString());
    }
}

또는

public static String getStackTrace (Throwable t)
{
    StringWriter stringWriter = new StringWriter();
    PrintWriter  printWriter  = new PrintWriter(stringWriter);
    t.printStackTrace(printWriter);
    printWriter.close();    //surprise no IO exception here
    try {
        stringWriter.close();
    }
    catch (IOException e) {
    }
    return stringWriter.toString();
}

또는

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
for(StackTraceElement stackTrace: stackTraceElements){
    logger.debug(stackTrace.getClassName()+ "  "+ stackTrace.getMethodName()+" "+stackTrace.getLineNumber());
}



skaffman의 답변은 틀림없이 정답입니다. error() , warn() , info() , debug() 와 같은 모든 로거 메서드는 Throwable을 두 번째 매개 변수로 사용합니다.

try {
...
 } catch (Exception e) {
logger.error("error: ", e);
}

그러나 stacktrace를 문자열로도 추출 할 수 있습니다. 때로는 "{}"자리 표시자를 사용하여 서식 지정 기능을 활용하려는 경우 유용 할 수 있습니다. void info(String var1, Object... var2); 이 경우 stacktrace를 String으로 사용한다고 가정하면 다음과 같이 실제로 할 수 있습니다.

try {
...
 } catch (Exception e) {
String stacktrace = TextUtils.getStacktrace(e);
logger.error("error occurred for usename {} and group {}, details: {}",username, group, stacktrace);
}

이렇게하면 메소드와 같은 방법으로 매개 변수화 된 메시지와 스택 logger.error("error: ", e); . logger.error("error: ", e);

실제로 stacktrace에서 약간의 노이즈를 필터링하는 옵션을 사용하여 String으로 스택 추적을 추출하는 유틸리티가있는 오픈 소스 라이브러리를 작성했습니다. 즉, 추출한 스택 트레이스에 관심이있는 패키지 접두어를 지정하면 관련없는 일부 요소에서 필터링되어 매우 consised 정보가 남습니다. 다음은 라이브러리에 어떤 유틸리티가 있고 어디에서 가져올 유틸리티 (maven 아티팩트와 git 소스)와 사용법을 설명하는 기사 링크입니다. 스택 추적 필터링 기능을 갖춘 오픈 소스 Java 라이브러리, 자동 문자열 분석 유니 코드 변환기 및 버전 비교 " Stacktrace 노이즈 필터 "단락을 참조하십시오.




Links