문제

컴파일러가 프로덕션 코드에서 디버깅 목적(예: 로깅)에 사용되는 명령문을 제거하는 것이 가능합니까?디버그 문은 주석을 사용하여 어떻게든 표시해야 합니다.

속성(debug = true)을 설정하고 각 디버그 문에서 이를 확인하는 것은 쉽지만 이로 인해 성능이 저하될 수 있습니다.컴파일러가 단순히 디버그 문을 사라지게 만들면 좋을 것입니다.

도움이 되었습니까?

해결책

두 가지 권장 사항

첫 번째 : 실제 로깅의 경우 log4j 또는 java 자체 내장 로깅과 같은 최신 로깅 패키지를 사용하십시오. 성능에 대해 너무 걱정하지 마십시오. 로깅 수준 검사는 나노초 단위입니다. (정수 비교입니다).

하나 이상의 로그 문이있는 경우 전체 블록을 보호하세요.

(log4j, 예 :) 라코 디스

이것은 런타임에 추가 된 능력 제어 로깅을 제공합니다. 디버그 빌드를 다시 시작하고 실행해야하는 것은 매우 불편할 수 있습니다.

초 :

어설 션 이 더 많습니다. 필요한 것. 어설 션은 선택적 메시지와 함께 부울 결과로 평가되는 명령문입니다. 라코 디스

어설 션 결과가 거짓이면 어설 션이 실패하고 메시지가 포함 된 AssertionError가 발생합니다 (이는 응용 프로그램을 종료하기위한 확인되지 않은 예외 임).

정말 좋은 점은 JVM에 의해 특별하게 처리되며 VM 매개 변수를 사용하여 런타임시 클래스 수준으로 전환 할 수 있다는 것입니다 (재 컴파일 필요 없음). 활성화하지 않으면 오버 헤드가 없습니다.

다른 팁

라코 디스 <시간> 라코 디스

컴파일러는 "Hello, logging world"와 함께 코드 블록을 제거합니다.ENABLE_LOGGING이 정적 최종 값이기 때문에 true로 설정되면 그 안에.proguard와 같은 obfuscator를 사용하면 Config 클래스도 사라집니다.

난독 처리기는 대신 다음과 같은 것을 허용합니다. 라코 디스 <시간> 라코 디스

Log # log 메소드는 컴파일러에서 아무 것도 감소하지 않고, 해당 메소드에 대한 모든 호출과 함께 난독 화기에 의해 제거되며 결국 Log 클래스도 제거됩니다.

또 다른 가능성은 로깅 함수 내에 if 문을 넣는 것입니다. 이렇게하면 코드가 줄어들지 만 일부 추가 함수 호출 비용이 발생합니다.

저는 또한 디버그 코드를 완전히 제거하는 것을 좋아하지 않습니다.프로덕션 환경에서 문제가 발생하면 디버그 메시지에 액세스해야 할 것입니다.코드 레벨 디버깅을 모두 제거하면 불가능합니다.

Java 전 처리기 를 사용 하시겠습니까?(google foo low 그러나 이것은 그것에 대해 논의하는 이전 Joel 포럼에 대한 링크입니다)

자바는 자체적으로 일종의 전처리기를 포함합니다. APT 라고합니다.코드를 처리하고 생성합니다.현재로서는 이것이 어떻게 작동해야하는지 잘 모르겠습니다 (나는 시도하지 않았습니다).하지만 이런 용도로 사용되는 것 같습니다.

또한 로깅 프레임 워크를 사용하는 것이 좋습니다.

logger.IsDebugEnabled()는 필수가 아니며 로깅 전에 시스템이 디버그 수준인지 확인하는 것이 더 빠를 수 있습니다.

로깅 프레임 워크를 사용하면 애플리케이션을 다시 시작하지 않고도 즉시 로깅 수준을 구성 할 수 있습니다.

다음과 같이 로깅 할 수 있습니다. 라코 디스

이것 "장난" 디버그 문이 사라지는 것 같습니다.

public static final boolean DEBUG = false;

if (DEBUG) { //disapeared on compilation }

그만큼 우편 그렇게 말했다 javac 확인할 만큼 똑똑하다 static final boolean 디버그 문을 제외합니다.(직접 시도해보지는 않았습니다)

로깅의 경우 개인적으로 다음과 같은 코드를 보고 싶지 않습니다.

if (logger.isDebugEnabled()) {
    logger.debug("....");
}
realImportantWork();

로깅하는 것 때문에 주의가 산만해집니다. realImportantWork().나에게 맞는 방법은 다음과 같습니다.

logger.debug("....");
realImportantWork()

프로덕션의 모든 디버그 메시지를 제외하는 구성도 있습니다.

내 말은 logger.isDebugEnabled() 제어는 내 일이 아니라 로깅 프레임워크의 일이어야 합니다.대부분의 로깅 프레임워크는 "로거", "LogLevel"과 같은 개념을 지원합니다.트릭을 할 수 있습니다.

질문에 직접 답하기 : 모르겠습니다.

하지만 다음은 문제에 대한 또 다른 해결책입니다. 제 생각에는 여기서 서로 충돌하는 두 개의 문이 있습니다. "디버그 문"과 "프로덕션 코드"입니다.

디버그 문의 목적은 무엇입니까? (단위) 테스트 중 버그 제거를 도와줍니다. 소프트웨어가 적절하게 테스트되고 요구 사항에 따라 작동하는 경우 디버그 문은 단종 일뿐입니다.

프로덕션 코드에 디버그 문을 남기는 데 동의하지 않습니다. 아무도 프로덕션 코드에서 디버그 코드의 부작용을 테스트하는 것을 귀찮게하지 않을 것입니다. 코드는 아마도해야 할 일을 수행 할 수 있지만 그 이상을 수행합니까? 모든 #defines가 올바르게 작동하고 실제로 모든 디버그 코드를 제거합니까? 모든 디버그 항목이 사라 졌는지 확인하기 위해 전처리 된 코드 10 만 줄을 분석하는 사람은 누구입니까?

프로덕션 코드에 대한 정의가 다르지 않는 한 코드를 테스트하고 완료 한 후에 디버그 문을 제거하는 것을 고려해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top