printStackTrace (); 피하십시오. 대신 로거 호출을 사용하십시오.


답변:


139

이는 다음과 같은 로깅 프레임 워크를 사용해야 함을 의미합니다. 또는 예외를 직접 인쇄하는 대신 :

e.printStackTrace();

다음 프레임 워크의 API를 사용하여 기록해야합니다.

log.error("Ops!", e);

로깅 프레임 워크는 많은 유연성을 제공합니다. 예를 들어 콘솔 또는 파일에 로깅할지 여부를 선택할 수 있습니다. 또는 일부 환경에서 더 이상 관련이없는 경우 일부 메시지를 건너 뛸 수 있습니다.


39

printStackTrace()예외 를 호출 하면 추적이 기록되고 System.err다른 곳으로 라우팅하거나 필터링하기가 어렵습니다. 이렇게하는 대신 로깅 프레임 워크 (또는 Apache Commons Logging과 같은 여러 로깅 프레임 워크에 대한 래퍼)를 사용하고 해당 프레임 워크 (예 :)를 사용하여 예외를 로깅하는 것이 logger.error("some exception message", e)좋습니다.

이를 통해 다음을 수행 할 수 있습니다.

  • 한 번에 다른 위치 (예 : 콘솔 및 파일)에 로그 문을 작성합니다.
  • 심각도 (오류, 경고, 정보, 디버그 등) 및 출처 (일반적으로 패키지 또는 클래스 기반)별로 로그 문을 필터링합니다.
  • 코드를 변경하지 않고도 로그 형식에 영향을 미칠 수 있습니다.
  • 기타

17

생산 품질 프로그램은 오류 및 기타 진단을보고하기 위해 많은 로깅 대안 (예 : log4j, logback, java.util.logging) 중 하나를 사용해야합니다. 여기에는 여러 가지 장점이 있습니다.

  • 로그 메시지는 구성 가능한 위치로 이동합니다.
  • 최종 사용자는 로깅을 구성하지 않는 한 메시지를 볼 수 없습니다.
  • 다른 로거 및 로깅 수준 등을 사용하여 기록되는 로깅의 양을 제어 할 수 있습니다.
  • 다른 어 펜더 형식을 사용하여 로깅의 모양을 제어 할 수 있습니다.
  • 로깅 출력을 더 큰 모니터링 / 로깅 프레임 워크에 쉽게 연결할 수 있습니다.
  • 위의 모든 작업은 코드를 변경하지 않고도 수행 할 수 있습니다. 즉, 배포 된 애플리케이션의 로깅 구성 파일을 편집합니다.

반대로 printStackTrace 만 사용하면 배포자 / 최종 사용자가 제어 할 수있는 권한이 거의 없으며 로깅 메시지가 손실되거나 부적절한 상황에서 최종 사용자에게 표시 될 수 있습니다. (그리고 무작위 스택 추적보다 소심한 사용자를 두렵게하는 것은 없습니다.)


6

Simple에서 e.printStackTrace ()는 표준 오류로 스택 추적을 인쇄하기 때문에 좋은 습관이 아닙니다. 이로 인해이 출력이 어디로 가는지 제어 할 수 없습니다.


0

거의 모든 로깅 프레임 워크는 메시지와 함께 throwable 개체를 전달할 수있는 메서드를 제공합니다. 처럼:

public trace(Marker marker, String msg, Throwable t);

던질 수있는 객체의 스택 트레이스를 인쇄합니다.


이것은 질문에 대한 답이 아닙니다.
Stephen C

-1

회사 개념에서 이야기합시다. 로그는 유연한 수준을 제공합니다 ( logger.info와 logger.debug의 차이점 참조 ). 다른 사람들은 QA, 개발자, 비즈니스맨과 같은 다른 수준을보고 싶어합니다. 그러나 e.printStackTrace ()는 모든 것을 인쇄합니다. 또한이 메서드가 편안하게 호출되는 것처럼 동일한 오류가 여러 번 인쇄 될 수 있습니다. 그런 다음 회사의 Devops 또는 Tech-Ops 직원은 동일한 오류 알림을 받기 때문에 미쳐있을 수 있습니다. 나는 더 나은 대체가 될 수 있다고 생각한다 log.error("errors happend in XXX", e) 이것은 또한 e.printStackTrace ()보다 읽기 쉬운 전체 정보를 인쇄 할 것입니다.


-3

주된 이유는 Proguard가 프로덕션에서 로그 호출을 제거하기 때문입니다. StackTrace를 로깅하거나 인쇄하면 예를 들어 Logcat Reader 응용 프로그램을 통해 Android 휴대폰 내에서 스택 추적 또는 로그 내부의 정보를 볼 수 있습니다. 그래서 그것은 보안에 나쁜 습관입니다. 또한 프로덕션 중에 액세스하지 않으므로 프로덕션에서 제거하는 것이 좋습니다. ProGuard는 stackTrace가 아닌 모든 로그 호출을 제거하므로 Log in catch 블록을 사용하고 Proguard가 프로덕션에서 제거하도록하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.