내 응용 프로그램에서 PMD를 통해 코드를 실행하고 있는데 다음 메시지가 표시됩니다.
- printStackTrace (); 피하십시오. 대신 로거 호출을 사용하십시오.
그게 무슨 뜻입니까?
내 응용 프로그램에서 PMD를 통해 코드를 실행하고 있는데 다음 메시지가 표시됩니다.
- printStackTrace (); 피하십시오. 대신 로거 호출을 사용하십시오.
그게 무슨 뜻입니까?
답변:
printStackTrace()
예외 를 호출 하면 추적이 기록되고 System.err
다른 곳으로 라우팅하거나 필터링하기가 어렵습니다. 이렇게하는 대신 로깅 프레임 워크 (또는 Apache Commons Logging과 같은 여러 로깅 프레임 워크에 대한 래퍼)를 사용하고 해당 프레임 워크 (예 :)를 사용하여 예외를 로깅하는 것이 logger.error("some exception message", e)
좋습니다.
이를 통해 다음을 수행 할 수 있습니다.
생산 품질 프로그램은 오류 및 기타 진단을보고하기 위해 많은 로깅 대안 (예 : log4j, logback, java.util.logging) 중 하나를 사용해야합니다. 여기에는 여러 가지 장점이 있습니다.
반대로 printStackTrace 만 사용하면 배포자 / 최종 사용자가 제어 할 수있는 권한이 거의 없으며 로깅 메시지가 손실되거나 부적절한 상황에서 최종 사용자에게 표시 될 수 있습니다. (그리고 무작위 스택 추적보다 소심한 사용자를 두렵게하는 것은 없습니다.)
회사 개념에서 이야기합시다. 로그는 유연한 수준을 제공합니다 ( logger.info와 logger.debug의 차이점 참조 ). 다른 사람들은 QA, 개발자, 비즈니스맨과 같은 다른 수준을보고 싶어합니다. 그러나 e.printStackTrace ()는 모든 것을 인쇄합니다. 또한이 메서드가 편안하게 호출되는 것처럼 동일한 오류가 여러 번 인쇄 될 수 있습니다. 그런 다음 회사의 Devops 또는 Tech-Ops 직원은 동일한 오류 알림을 받기 때문에 미쳐있을 수 있습니다. 나는 더 나은 대체가 될 수 있다고 생각한다 log.error("errors happend in XXX", e)
이것은 또한 e.printStackTrace ()보다 읽기 쉬운 전체 정보를 인쇄 할 것입니다.
주된 이유는 Proguard가 프로덕션에서 로그 호출을 제거하기 때문입니다. StackTrace를 로깅하거나 인쇄하면 예를 들어 Logcat Reader 응용 프로그램을 통해 Android 휴대폰 내에서 스택 추적 또는 로그 내부의 정보를 볼 수 있습니다. 그래서 그것은 보안에 나쁜 습관입니다. 또한 프로덕션 중에 액세스하지 않으므로 프로덕션에서 제거하는 것이 좋습니다. ProGuard는 stackTrace가 아닌 모든 로그 호출을 제거하므로 Log in catch 블록을 사용하고 Proguard가 프로덕션에서 제거하도록하는 것이 좋습니다.