문제

나는 큰 팬입니다 log4net, 그러나 최근에 일부 (내 부서에서)는 각 로깅 방법의 무겁기 때문에 프로젝트에 포함 시켰습니다. 나는 다른 기술보다 더 나은 기술이 있다고 주장하지만 그것은 또 다른 질문입니다.

Log4Net Debugformat 유형의 호출이 응용 프로그램에 대한 일반적인 영향은 무엇인지 궁금합니다. 코드 줄 당 로그 문의 수 등과 같은 변수를 남기겠습니다. 실제 세계에서 본 것을 찾고 있기 때문입니다.

그리고 나는 긴 평가 진술에 가드 조항을 추가하는 간단한 기술을 알고 있습니다.

if (log.IsDebug)
{
  log.DebugFormat(...);
}

따라서 지금은 고려 사항을 제외 해 봅시다.

도움이 되었습니까?

해결책

log4net 또는 log.debugformat (...)에 익숙하지 않습니다.

그러나 벌목 비용은 실제로 두 영역에 있습니다.

첫 번째는 로깅 호출이고 두 번째는 로그 정보의 실제 지속입니다.

경비원은 로깅이 실제로 필요하지 않을 때 벌목 통화를 최소로 줄이는 데 도움이됩니다. 메소드 호출과 두 스칼라의 비교에 지나지 않기 때문에 매우 빠른 경향이 있습니다.

그러나 경비원을 사용하지 않으면 비용이 실제 벌목 인수를 만드는 가격이 될 수 있습니다.

예를 들어, Log4J에서 이것은 일반적인 관용구였습니다.

log.debug("Runtime error. Order #" + order.getOrderNo() + " is not posted.");

여기서 비용은 메시지를 만드는 문자열 표현식의 실제 평가입니다. 로깅 레벨에 관계없이 그 표현식 및 결과 문자열이 생성되기 때문입니다. 대신 다음과 같은 것이 있다고 상상해보십시오.

log.debug("Something wrong with this list: " + longListOfData);

로그 레벨이 디버그로 설정되지 않은 경우 단순히 낭비되는 크고 비싼 문자열 변수를 만들 수 있습니다.

경비원 :

if (log.isDebug()) {
    log.debug(...);
}

ISDEBUG 호출은 특히 논쟁의 실제 생성과 비교하여 저렴하기 때문에이 문제를 제거하십시오.

내 코드에서 로깅을위한 래퍼를 작성했으며 다음과 같은 로그를 만들 수 있습니다.

log.debug("Runtime error. Order # {0} is not posted.", order.getOrderNo());

이것은 좋은 타협입니다. 이것은 Java Varargs에 의존하고 내 코드는 로깅 레벨을 확인한 다음 메시지를 적절하게 형식화합니다. 이것은 경비원만큼 빠르지 만 글을 쓰는 것이 훨씬 더 깨끗합니다.

이제 Log.debugformat은 내가 모르는 비슷한 일을 할 수 있습니다.

물론이 외에도 실제 로깅 비용 (화면, 파일, 소켓 등)이 있습니다. 그러나 그것은 당신이 받아 들여야하는 비용 일뿐입니다. 이에 대한 나의 모범 사례는 실제로서 실제 로그 메시지를 대기열로 라우팅하는 것입니다. 그런 다음 별도의 스레드를 사용하여 적절한 채널로 거두어 출력됩니다. 이는 적어도 메인 컴퓨팅과 일치하는 데 도움이되지만 자체의 비용과 복잡성이 있습니다.

다른 팁

나는 이것이 오래된 스레드라는 것을 알고 있지만, 로그 레벨을 기반으로 IF 문으로 코드를 채우지 않는 접근 방식을 사용하는 것은 다음과 같습니다.http://www.beefycode.com/post/extension-methods-for-deferred-message-formatting-n-log4net.aspx

Lambda 표현식을 사용하여 메시지를 작성하면 메시지를 완전히 평가하지도 않습니다.

그만큼 Log4net FAQ는 이에 대한 답변이 있습니다, 당신이 찾고있는 세부 사항 수준은 아니지만.

요약 : 그 가드 조항을 사용하십시오.

Hartung의 대답을 제공합니다.

Debugformat 코드는 다음과 같습니다.

if (IsDebugEnabled)
{
    Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null);
}

기본적으로 그것은 동일하므로 Debugformat을 사용할 때 가드 조항을 사용할 필요가 없다고 생각합니다 (여전히 작은 오버 헤드가있을 수 있지만 무시할 정도로 작다고 생각합니다).

의견을 남겼을 것입니다. 그러나 나는 충분한 명성이 없습니다 :/

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