IT이야기

stacktrace를 log4j로 전송하는 방법

cyworld 2022. 6. 10. 21:32
반응형

stacktrace를 log4j로 전송하는 방법

예를 들어 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 {
   ...
} catch (Exception e) {
    log.error( "failed!", e );
}

스택 트레이스를 렌더링하는 것은 log4j에 달려 있습니다.

예외를 포함하지 않고 스택트레이스를 로그에 기록하는 경우는, 다음의 순서에 따릅니다.

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);

스택 트레이스를 스트링으로 취득할 수도 있습니다.ExceptionUtils.getStackTrace.

참조: Exception Utils.java

에만 사용합니다.log.debug,유지하기 위해log.error간단하죠.

Skaffman의 답은 확실히 정답이다.다음과 같은 모든 로거 방식error(),warn(),info(),debug()Trowable을 두 번째 매개 변수로 사용합니다.

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

그러나 Stacktrace를 String으로 추출할 수도 있습니다."{}" 자리 표시자를 사용하여 포맷 기능을 이용하려는 경우 유용할 수 있습니다. 방법을 참조하십시오.void info(String var1, Object... var2);이 경우 스택트레이스가 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);

실제로 Stacktrace에서 노이즈를 스마트하게 필터링할 수 있는 옵션이 있는 String으로서 Stacktrace를 추출하는 유틸리티가 있는 오픈 소스 라이브러리를 작성했습니다.즉, 추출한 스택 트레이스에 관심이 있는 패키지 프레픽스를 지정하면 관련 없는 부분에서 필터링되어 매우 신중한 정보가 남습니다.다음은 라이브러리의 유틸리티와 입수처(매븐 아티팩트 및 git 소스 모두) 및 사용방법을 설명하는 기사 링크입니다.스택 추적 필터링, 자동 문자열 구문 분석 유니코드 변환기버전 비교 기능이 있는 오픈 소스 Java 라이브러리 "스택 추적 노이즈 필터" 단락을 참조하십시오.

나에게 일어난 일이기 때문에 그리고 유용할 수 있다.이렇게 하면

try {
   ...
} catch (Exception e) {
    log.error( "failed! {}", e );
}

스택 트레이스 전체가 아니라 예외 헤더를 가져옵니다.로거는 사용자가 String을 전달하고 있다고 생각하기 때문입니다.필요 없는 작업{}스카프먼의 말대로

Log4j 2에서는 Logger.capting()사용하여 검출된 예외에서 스택 트레이스를 기록할 수 있습니다.

    try {
        String msg = messages[messages.length];
        logger.error("An exception should have been thrown");
    } catch (Exception ex) {
        logger.catching(ex);
    }

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

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());
}

「spar/other logging/monitoring s/w는 「log4j」/「monitoring s/w」입니다. 것은 쌍입니다. obj log4j에서 가져옵니다e

    try {
          ---
          ---
    } catch (Exception e) {
        log.error("api_name={} method={} _message=\"error description.\" msg={}", 
                  new Object[]{"api_name", "method_name", e.getMessage(), e});
    }
Try this:

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

아래 코드를 사용할 수 있습니다.

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

public class LogWriterUtility {
    Logger log;

    public LogWriterUtility(Class<?> clazz) {
        log = LogManager.getLogger(clazz);
    }

public void errorWithAnalysis( Exception exception) {

        String message="No Message on error";
        StackTraceElement[] stackTrace = exception.getStackTrace();
        if(stackTrace!=null && stackTrace.length>0) {
            message="";
            for (StackTraceElement e : stackTrace) {
                message += "\n" + e.toString();
            }
        }
        log.error(message);


    }

}

그냥 하면 돼요.LogWriterUtility.errorWithAnalysis( YOUR_EXCEPTION_INSTANCE);

stackTrace가 로그에 인쇄됩니다.

것것 create create create create create create create create를 만듭니다.class

public class StdOutErrLog {

private static final Logger logger = Logger.getLogger(StdOutErrLog.class);

public static void tieSystemOutAndErrToLog() {
    System.setOut(createLoggingProxy(System.out));
    System.setErr(createLoggingProxy(System.err));
}

public static PrintStream createLoggingProxy(final PrintStream realPrintStream) {
    return new PrintStream(realPrintStream) {
        public void print(final String string) {
            logger.info(string);
        }
        public void println(final String string) {
            logger.info(string);
        }
    };
}
}

코드로 호출합니다.

StdOutErrLog.tieSystemOutAndErrToLog();

언급URL : https://stackoverflow.com/questions/4347797/how-to-send-a-stacktrace-to-log4j

반응형