2017-01-09 1 views
1

디버깅 및 추적 로깅이 너무 많아서 로깅 수준이 꺼지더라도 메시지 인수 배열을 만드는 유일한 오버 헤드가 우리 시대의 일부 문제가됩니다 - 민감한 알고리즘. 이제는 로그를 완전히 제거하지 않으려합니다 (개발 및 테스트 환경에서 분명히 유용하므로).하지만 런타임 오버 헤드를 어떻게 든 줄이고 싶습니다. 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 구성을 통해이 문제를 해결할 수 있습니까? 아니면이를 수행 할 수있는 기존 도구가 있습니까?

답변

0

미친 아이디어 : slf4j에 동일한 인터페이스를 사용하지만 펼쳐진 가변 인수를 사용하여 자신의 인터페이스 & 구현을 구현하는 방법은 무엇입니까? 본질적으로 요구 사항에 맞게 slf4j를 포크하십시오.

또 다른 아이디어는 SLF4J-to-Log4j2 마이그레이션 도구를 빌드하는 것입니다. 귀하의 회사가 Log4j2 프로젝트에 대한 공헌으로 이것을 제안 할 수 있으므로 동의하지 않아도됩니다. :-)

+0

맞춤형 로깅 인터페이스는 우리가 피하려고하는 것과 똑같습니다. 수동 리파인 작업은 너무 많은 수동 리팩터링 작업을 필요로합니다. Log4j2 API로 전환하면 문제가 해결 될 것입니다. – JustACluelessNewbie

+0

다행히 slf4j API는 작습니다. 대부분 Imported이고, LoggerFactory를 LogManager로 대체하는 코드와 ThreadContext에 의한 MDC라고 생각합니다. –

+0

그래, find-replace를 사용하고 잠재적으로 비용이 많이 드는 일부 로그를'Suppliers'를 사용하도록 리팩토링하는 것일뿐입니다. ProGuard 솔루션은 이미 작동하므로 (일종의),이 두 가지를 짝을 지어 사용해도 충분합니다. 나는 희망. – JustACluelessNewbie

관련 문제