디버깅 및 추적 로깅이 너무 많아서 로깅 수준이 꺼지더라도 메시지 인수 배열을 만드는 유일한 오버 헤드가 우리 시대의 일부 문제가됩니다 - 민감한 알고리즘. 이제는 로그를 완전히 제거하지 않으려합니다 (개발 및 테스트 환경에서 분명히 유용하므로).하지만 런타임 오버 헤드를 어떻게 든 줄이고 싶습니다. SLF4J API를 죽겠다 게으른 로깅 너무 많은 리팩토링과 육체 노동을 필요로 Log4j2를 사용ProGuard를 사용한 디버그 로그 제거
- : 우리는 몇 가지 옵션을 고려했다. 커스텀 로거 래퍼와 if 문으로 모든 로거 호출을 랩핑 할 때도 마찬가지이다 ..
- 코드 포스트 프로세서는 자동으로 모든 로그를 조건문과 함께 감쌀 수있다.
- ProGuard는 모든 로거 호출을 제거 할 수 있습니다.
로그 아웃을 제거하는 코드 포스트 프로세서를 찾지 못했기 때문에 ProGuard 솔루션을 사용하기로 결정했습니다. 이것은 ProGuard의 기본 설정입니다.
-optimizations code/removal/simple,code/removal/advanced
-dontobfuscate
-dontshrink
-keep class *
-keepclassmembers class * {
*;
}
-assumenosideeffects class org.slf4j.Logger {
void trace(...);
void debug(...);
}
이 솔루션은 부분적으로 작동합니다. 대부분의 디버그 로그는 실제로 제거되지만 디버그 로그 인수에서 호출 된 모든 메소드는 영향을받지 않습니다. 예를 들어,이 라인은 :
log.debug("Evidence {} is unverifiable for product {}", evidence, product.getData().getName());
...이로 변환 될 것이다 :
product.getData().getName()
아이러니하게도, 그것은 또한 모든 객체의 배열 입문 잎 : 지금
log.debug("{} {} {}", first, second, third);
// ...becomes:
Object[] var10000 = new Object[]{first, second, third};
를 I 이 종류의 일은 JIT (unused variables removal)에 의해 최적화되어야한다는 것을 알기 바란다 - 모든 호출 된 메소드가 로깅과 함께 제거되지 않는 첫 번째 경우가 더 걱정된다. 이것들은 무해한 (단순한 getter 호출) 것보다 다소 나 빠질 수 있습니다 (동시 콜렉션에서 size()
호출).
현재 ProGuard 솔루션은 "충분 함"이지만 로깅 호출 (및 부작용)을 완전히 제거 할 수 있는지 궁금합니다. ProGuard 구성을 통해이 문제를 해결할 수 있습니까? 아니면이를 수행 할 수있는 기존 도구가 있습니까?
맞춤형 로깅 인터페이스는 우리가 피하려고하는 것과 똑같습니다. 수동 리파인 작업은 너무 많은 수동 리팩터링 작업을 필요로합니다. Log4j2 API로 전환하면 문제가 해결 될 것입니다. – JustACluelessNewbie
다행히 slf4j API는 작습니다. 대부분 Imported이고, LoggerFactory를 LogManager로 대체하는 코드와 ThreadContext에 의한 MDC라고 생각합니다. –
그래, find-replace를 사용하고 잠재적으로 비용이 많이 드는 일부 로그를'Suppliers'를 사용하도록 리팩토링하는 것일뿐입니다. ProGuard 솔루션은 이미 작동하므로 (일종의),이 두 가지를 짝을 지어 사용해도 충분합니다. 나는 희망. – JustACluelessNewbie