2010-01-04 4 views
2

비 정기적 로깅은 비용이 많이 듭니다. 따라서 로깅 임계 값을 높이거나 로깅 임계 값 레벨을 높이면 생산 모드에서 로깅을 줄일 수 있습니다 (모두가 알고 있습니다!)로깅 선점

그러나 로거 명령문에 매개 변수를 제공하기 위해 호출되는 루틴은 어떻습니까?

로거 문을 고려하십시오.

logger.info ("number of windows ="+ wins.size());

여기서 wins.size()는 엄청나게 비싼 작업입니다. 예를 들어 내 (잘못) 이해를 설명하기위한 것입니다.

정보 로깅이 해제되어 있으면 wins.size()가 계속 실행됩니다.

디버깅을 수행 할 때 loginsfo() 전에 먼저 wins.size()가 단계적으로 실행되는 것으로 보입니다. 그렇다면 로거가 꺼져있을 때 로거 문 안의 값 비싼 기능이 실행되지 않도록하기위한 전략은 무엇입니까?

답변

5

C# 3.0에서는 로깅 기능이 켜져있을 때만 lambda를 사용하여 로깅 기능 호출 만 실행할 수 있습니다. 이 예를 사용하여 C#을 Common.Logging입니다 : 트레이스과 같이 정의된다

Logger.Trace(m=>m("number of windows="+wins.size())); 

:

void Trace(Action<FormatMessageHandler> formatMessageCallback); 

및 FormatMessageHandler이

public delegate string FormatMessageHandler(string format, params object[] args); 

입니다 추적이 m=>m("number of windows="+wins.size()) 람다 켜져있는 경우 그래서 무슨 일입니다 호출됩니다. 꺼져 있으면 창 크기를 얻으려는 고비용의 전화가 절대로 생성되지 않습니다.

2

로깅 수준이 로깅되기 전에 항상 활성화되어 있는지 확인해야합니다 (예 : esp). 특히 값 비싼 계산이 필요한 무언가를 로깅 할 계획이라면 정보 로깅이 꺼져 wins.size() 실행하지 않는 것이 확실한

if (logger.isInfoEnabled()) { 
     logger.info("number of windows="+wins.size()); 
} 

경우 : Java 용 아파치의 평민 로깅은이 작업을 수행 할 수 있도록 코드의 앞 경비를 넣을 수 있습니다. Log4j 및 내장 Java 로거 클래스를 사용하여 유사한 작업을 수행 할 수 있습니다.

1

최근 프로젝트에서 이와 유사한 전략을 사용하여 도처에 logger.IsDebugEnabled()과 같은 체크를하지 않아도됩니다. 기본적으로 기본 로거 구현에서 파생되었으며 값 비싼 메소드를 호출하는 Closure을 허용하는 추가 메서드를 추가했습니다. 클로저에 전달하면 실제로 호출 할 때까지 코드가 실행되지 않습니다. 로깅은 가능한 한 애스펙트 지향적이어야하며 모든 코드에서 변경하지 않고도 제대로 작동해야합니다.

C#과 Ruby에서 접근법은 비슷할 것입니다 : 람다 또는 블록을 전달하고 런타임에 실제로 필요할 때까지 코드 실행을 연기하십시오. 윈 - 윈!

0

This article Java와 관련된 일반적인 로깅 방법에 대해 설명합니다. 우수한 독서.