2013-11-15 4 views
2

로그 문에 고유 한 식별자를 추가하여 모든 로그 문에 문서 (외부, 예 : 위키)를 추가 할 수 있으므로 사용자가 관련 메시지에 빠르게 액세스 할 수 있습니다 id를 사용한 문서화. 로깅 프레임 워크는 SLF4J/logback을 사용하고 싶습니다.SLF4J를 사용할 때 로그 메시지의 ID

감사 프레임 워크와 관련된 일부 비트를 제외하고는 관련 접근법에 대한 문서를 찾을 수 없었습니다.

ID 삽입에 사용할 수 있다고 생각한 마커 개념이 있거나 메시지 텍스트 자체에 ID를 추가 할 수 있습니다.

로깅 문장에 "올바른 방법"으로 ID를 추가하는 방법은 무엇입니까? 제가 생각지 못했던 가능성이 있습니까?

편집

용어 고유 한 ID 로그 문 당 식별자가 있어야 상태. 현상 제 그러한 ID를 테이블/열거 형/수동으로 추가합니다. 이는 잘못 수행 될 수 있습니다. 이러한 ID는 안정적이어야하므로 문서화가 가능합니다. 그래서 ID 자체는 제가 궁금해하는 것이 아닙니다.

내 질문은 : 메시지 텍스트와 함께 로거에 ID를 푸시하는 올바른 방법은 무엇입니까? ID를 메시지 텍스트에 삽입해야합니까? 아니면 다른 가능성이 있습니까?

그래서, 기본적으로, 나는

logger.info(IDMarkers.DB_CONNECTION_FAILED, "no connection to the database"); 

또는 대신

logger.info("[{}] no connection to the database", LogIDs.DB_CONNECTION_FAILED); 

먼저 접근 ID를 보여주는하면 로깅 시스템/구성에 달려 장점이있다을 사용합니다.

+0

어떻게 고유 한 ID를 원하십니까? 전화? 스레드로? 코드 줄로? – zenbeni

+0

@zenbeni : 로그 문 (예 :'logger.debug ('some message text')')이 ID를 얻어야합니다. 그러한 진술은 예를 들어모든 호출에 대해 '[ID1234] 메시지 텍스트'와 같은 로그 항목. –

+0

런타임에 실행 컨텍스트를 얻는 것은 비용이 많이 든다. http://stackoverflow.com/questions/17473148/dynamically-get-the-current-line-number 그래서 메시지에서 정적으로 수행해야한다고 생각한다. – zenbeni

답변

0

고유 한 것은 일부 범위 내에서만 고유합니다. 결국 모든 int 또는 long 값이 사용됩니다.

"독창성"이 무엇을 의미하는지 생각해보십시오. 그런 다음 삽입 된 ID로 로깅이 처리되도록 래퍼를 사용하십시오.

slf4j에서는 interface을 처리하므로 많은 로깅 API를 만들 수 있습니다. 입니다. 즉, 일관된 로깅을 보장하기 위해 인터페이스 구현을 하위 클래스 화하거나 심지어 삽입 할 수있는 옵션이 없을 것입니다. 따라서 로깅 API를 래핑하는 것과 같은 기술에 제약을 받게됩니다 (가능한 한 "일관된"인터페이스를 통해).

package mypackage.log; 

public class LoggerWrapper implements org.log4j.Logger { 

    private org.log4j.Logger logger; 

    public LoggerWrapper(org.log4j.Logger logger) { 
    this.logger = logger; 
    } 

    public String getUniqueId() { 
    return ...; 
    } 

    public void info(String message, Object params...) { 
    logger.info(String.format("[%d] %s", getUniqueId(), message), params)); 
    } 

    ... implement all the other methods ... 
} 

그리고 이것은 당신이 당신의 자신의 LoggerFactory 인터페이스를 확인해야한다는 것을 의미 너무

public Logger getLogger(String name) { 
    return new LoggerWrapper(org.sql4j.LoggerFactory(name)); 
} 

위의 코드를 몇 사마귀 (실제로 테스트되지 않음)이 있지만; 잘하면, 그것은 당신에게 아이디어를 줄 것이다.

+0

방향을 지적하도록 제 질문을 업데이트했습니다. 당신의 제안 된 솔루션은 로그 엔트리마다 고유 한 ID를 부여 할 것이고, 이는 로그 문서에 문서를 연결하는 것을 지원하지 않을 것입니다 ... –

+0

내 솔루션은 당신이 원하는 모든 것을위한 고유 한 ID를 제공 할 것입니다. 예를 들어 상수 문자열로 래퍼를 구성하면 로거별로 고유 한 로그 ID가됩니다. 또는'getUniqueId()'에서 스레드 감지 코드를 사용하여 스레드 당 고유 ID를 가질 수 있습니다. 고유성을 결정하는 것은 사용자의 몫입니다. –

관련 문제