printStackTrace()를 피하고 대신 로거 호출을 사용합니다.
제 어플리케이션에서는 PMD를 통해 코드를 실행하고 있습니다.다음 메시지가 나타납니다.
- printStackTrace()는 피하고 대신 로거 콜을 사용합니다.
그게 무슨 의미죠?
즉, 예외를 직접 인쇄하는 대신 logback 또는 log4j와 같은 로깅 프레임워크를 사용해야 합니다.
e.printStackTrace();
다음 프레임워크의 API를 사용하여 로그를 기록해야 합니다.
log.error("Ops!", e);
로깅 프레임워크는 매우 유연하게 사용할 수 있습니다.예를 들어 콘솔 또는 파일에 기록할 것인지 선택할 수 있습니다.또, 일부의 메세지가 일부의 환경에 관련하지 않게 되었을 경우는 생략할 수도 있습니다.
전화하시면printStackTrace()예외적으로 그 추적은 에 쓰여진다.System.err다른 곳으로 전송(또는 필터링)하기가 어렵습니다.이를 수행하는 대신 로깅 프레임워크(또는 Apache Commons Logging과 같은 여러 로깅 프레임워크에 대한 래퍼)를 사용하여 예외를 기록하는 것이 좋습니다(예:logger.error("some exception message", e)).
이를 통해 다음 작업을 수행할 수 있습니다.
- 로그 스테이트먼트를 콘솔과 파일 등 다른 장소에 동시에 기입합니다.
- 중대도(오류, 경고, 정보, 디버깅 등) 및 오리진(오류 패키지 또는 클래스 기반)별로 로그 문을 필터링합니다.
- 코드를 변경하지 않고 로그 형식에 어느 정도 영향을 주다
- 기타.
프로덕션 품질 프로그램은 오류 및 기타 진단을 보고하기 위해 다양한 로깅 대체 방법(log4j, logback, java.util.logging 등) 중 하나를 사용해야 합니다.여기에는 다음과 같은 이점이 있습니다.
- 로그 메시지는 설정 가능한 위치로 이동합니다.
- 로그를 설정하지 않으면 최종 사용자는 메시지를 볼 수 없습니다.
- 다양한 로거와 로깅 수준 등을 사용하여 기록되는 로깅의 양을 제어할 수 있습니다.
- 다양한 Appender 형식을 사용하여 로그 모양을 제어할 수 있습니다.
- 로깅 출력을 더 큰 모니터링/로그 프레임워크에 쉽게 연결할 수 있습니다.
- 위의 모든 작업은 코드를 변경하지 않고 실행할 수 있습니다.즉, 전개된 애플리케이션의 로그 설정 파일을 편집하는 것으로 실행할 수 있습니다.
반면 printStackTrace만 사용하는 경우 디플로이터/최종 사용자는 제어가 거의 이루어지지 않으며 로그 메시지가 손실되거나 부적절한 상황에서 최종 사용자에게 표시되기 쉽습니다(또한 랜덤 스택 추적만큼 겁이 많은 사용자에게 두려운 것은 없습니다).
Simple의 경우, 예를 들어 printStackTrace()는 스택트레이스를 표준 에러로 출력하기 때문에 좋은 프랙티스가 아닙니다.이 때문에, 이 출력의 행선지를 제어할 수 없습니다.
거의 모든 로깅 프레임워크는 메시지와 함께 던질 수 있는 개체를 전달할 수 있는 방법을 제공합니다.예를 들어 다음과 같습니다.
public trace(Marker marker, String msg, Throwable t);
이들은 던질 수 있는 개체의 스택 트레이스를 인쇄합니다.
회사 개념으로 이야기해 봅시다.로그는 유연한 레벨을 제공합니다(logger.info과 logger.disc의 차이 참조).QA, 개발자, 비즈니스맨 등 다양한 수준의 정보를 원하는 사람이 있습니다.단, e.printStackTrace()는 모든 것을 출력합니다.또, 이 메서드를 restful하게 호출하면, 같은 에러가 몇번이나 인쇄되는 일이 있습니다.그러면 귀사의 Devops 또는 Tech-Ops 담당자는 동일한 오류 리마인더를 받기 때문에 미쳐버릴 수 있습니다.더 나은 대체물이 될 수 있을 것 같아요log.error("errors happend in XXX", e) e e.printStackTrace()보다 쉬운 됩니다.
주된 이유는 Proguard가 Log calls를 프로덕션에서 삭제하기 때문입니다.StackTrace를 로깅 또는 인쇄함으로써 Logcat Reader 어플리케이션 등에 의해 Android 전화기 내부에서 이러한 정보(스택트레이스 또는 로그 내의 정보)를 볼 수 있기 때문입니다.그래서 그것은 보안에 대한 나쁜 관행이다.또, 생산시에는 액세스 할 수 없기 때문에, 생산에서 제외하는 것이 좋습니다.ProGuard는 stackTrace가 아닌 모든 Log 콜을 삭제하므로 Log in catch block을 사용하여 Proguard의 프로덕션에서 삭제하는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/10477607/avoid-printstacktrace-use-a-logger-call-instead
'source' 카테고리의 다른 글
| SELECT 목록이 GROUP BY 절에 없으며 집계되지 않은 열 ......이(가) sql_mode=only_full_group_by와 호환되지 않습니다. (0) | 2023.01.15 |
|---|---|
| Vuetify에서 의 동적 자리 표시자 텍스트를 표시하는 방법은 무엇입니까? (0) | 2023.01.15 |
| Mariadb 컨테이너는 3310 대신 포트 3306을 여전히 구속하고 있습니다. (0) | 2023.01.15 |
| 다른 스크립트에서 스크립트를 호출하는 가장 좋은 방법은 무엇입니까? (0) | 2023.01.15 |
| Python 진행 표시줄 (0) | 2023.01.15 |