log4j가 예외에 대한 스택 추적을 인쇄하지 않습니다.
바람둥이와 함께 log4j를 사용하고 있습니다. 내 JSP에 예외를 기록하면 서블릿이 다음을 수행합니다.
private Logger _log = Logger.getLogger(this.getClass());
...
try{...} catch (Exception e) {
_log.error("Error refreshing all prices", e);
}
스택 추적없이 예외의 첫 번째 줄만 얻습니다.
2 월 17 일 17:37:45 오류 AutoContrib : 175-csv 파일을 게시하는 동안 예외 : java.lang.ArrayIndexOutOfBoundsException
전혀 도움이되지 않습니다!
내 log4j.properties 파일 (/tomcat/common/classes/log4j.properties)은 다음과 같습니다.
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{dd-MMM HH:mm:ss} %5p %c{1}:%L - %m%n
log4j.appender.stdout.threshold=info
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.maxFileSize=5000KB
log4j.appender.file.maxBackupIndex=10
log4j.appender.file.File=${catalina.home}/logs/web.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{dd-MMM HH:mm:ss} %5p %c{1}:%L - %m%n
log4j.appender.file.threshold=info
log4j.rootLogger=debug, stdout, file
사실, 이것은 아마도 핫스팟 최적화 때문일 것입니다. 같은 예외가 발생하면 트레이스 출력이 중지됩니다. VM 인수로 끌 수 있습니다. 다음을 참조하십시오.
에서 http://www.oracle.com/technetwork/java/javase/relnotes-139183.html :
이제 서버 VM의 컴파일러는 모든 "콜드"기본 제공 예외에 대해 올바른 스택 역 추적을 제공합니다. 성능상의 이유로 이러한 예외가 몇 번 발생하면 메서드가 다시 컴파일 될 수 있습니다. 재 컴파일 후 컴파일러는 스택 추적을 제공하지 않는 사전 할당 된 예외를 사용하여 더 빠른 전술을 선택할 수 있습니다. 사전 할당 된 예외의 사용을 완전히 비활성화하려면 다음 새 플래그를 사용하십시오. -XX : -OmitStackTraceInFastThrow.
여기 더 :
게시 한 내용은 javadoc에 명시된대로 스택 추적을 표시해야합니다 .
메시지를 포함하지 않고를 호출 logger.error(ex)
하면 스택 추적이 기록되지 않습니다.
오류 방법에는 두 가지 오버로드 된 방법이 있습니다.
logger.error(ex);
logger.error("some oops string ", ex);
첫 번째 방법을 사용하면 예외의 이름 만 인쇄됩니다. 두 번째 방법을 사용하는 경우 방법과 유사한 전체 스택 추적을 인쇄하는 예외와 함께 일부 메시지가 표시됩니다 e.printStackTrace()
.
위의 @Luhar가 대답했듯이, 나는 똑같은 일로 어려움을 겪었고 마침내 이것은 나를 위해 일했습니다. 이 접근 방식에 대한 좋은 점은 JVM, Log4J와 같은 시스템 수준 설정을 조정할 필요가 없다는 것입니다. 예기치 않은 새로운 놀라움으로 이어질 수 있다는 사실을 결코 알지 못하기 때문입니다!
try {
...
..
} catch (Exception er) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
er.printStackTrace(new PrintStream(os));
LOGGER.error(new String(os.toByteArray()));
//LOGGER.error(er);
}
구성에 문제가없는 것으로 확인되었으므로 log4j
최신 버전 (반드시 최신 버전은 아님)으로 업그레이드하십시오.
이 경우 문제는 아니지만 로거를 만드는 것이 좋습니다. private static final
fillStackTrace 호출을 사용하지 않았으므로 작동하는지 설명 할 수 없습니다. 또 다른 방법은 Exception에서 서식이 지정된 텍스트를 반환하는 작은 메서드를 사용하는 것입니다.
public static String getStackTrace(Exception e)
{
StringWriter sWriter = new StringWriter();
PrintWriter pWriter = new PrintWriter(sWriter);
e.printStackTrace(pWriter);
return sWriter.toString();
}
In your logging code, you could write:
logger.error("An exception occurred: " + Utils.getStackTrace(e));
You can add these lines of code in your catch block.
catch (SQLException e) {
CharArrayWriter cw = new CharArrayWriter();
PrintWriter w = new PrintWriter(cw);
e.printStackTrace(w);
w.close();
String trace = cw.toString();
log.error("This is complete stacktrace", trace);
}
Using your code sample:
private static final Logger _log = Logger.getLogger(MyClass.class);
...
try{...} catch (Exception e) {
//Change
//_log.error("Error refreshing all prices", e);
//To
_log.error("Error refreshing all prices", e.fillInStackTrace());
}
You'll see all the stack trace displayed.
PS. Make Logger a singleton...(check my declaration) just after declaring public class MyClass {
참고URL : https://stackoverflow.com/questions/2295015/log4j-not-printing-the-stacktrace-for-exceptions
'code' 카테고리의 다른 글
componentDidMount가 참조 콜백 전에 호출 됨 (0) | 2020.11.11 |
---|---|
Oracle의 OVER 절 (0) | 2020.11.11 |
파이썬을 사용하여 실제 사용자 홈 디렉토리를 찾는 방법은 무엇입니까? (0) | 2020.11.11 |
히스토그램을 사용하는 Matplotlib / Pandas 오류 (0) | 2020.11.11 |
Django의 manage.py 테스트 명령 중에 실행 된 테스트를 확인하는 방법 (0) | 2020.11.11 |