2011-05-16 3 views
3

두 가지 유형의 메시지 (응용 프로그램 로그 메시지 및 감사 메시지)를 기록해야하는 응용 프로그램이 있습니다. 응용 프로그램 로그 메시지는 표준 lo4j Logger과 완벽하게 일치하지만 감사 로그에는 여러 가지 필수 매개 변수가 있습니다.log4j를 감싸거나 사용자 정의 로거를 만드시겠습니까?

debug(), info() 등의 추가 매개 변수를 추가하려면 log4j를 감싸 야한다고 생각하지만 log4j를 감싸는 아이디어는 싫다. 해야할까요 :

  1. log4j를 완전히 감싸고 내 뒤에 Logger 클래스를 제공하여 log4j 로거를 scenes 뒤에 호출합니다.
  2. log4j Logger 클래스를 확장하고 필수 매개 변수와 함께 "감사 로그"메소드를 추가하십시오.
  3. 무언가 더 ... 그래서 로깅 라이브러리를 포장하고 있지 않다 우아한

답변

4

error의 "메시지", warnLogger는 임의의 객체 인의 log4j의 방법; 문자열 일 필요는 없습니다. 서로 다른 매개 변수를 포함하는 고유 한 "메시지"클래스를 만들 수 있습니다. 로거는 감사 로거의 appender에 대해 사용자 정의 Layout 클래스를 사용하여 데이터를 다르게 추가 할 수 있습니다. 다른 펜더 ​​당신이 건너을 공유 할 수 있습니다 갖는

private final static Logger log = new Logger("AuditTrail"); 

: 특정 범주를 만들

private final static Logger log = new Logger(MyClass.class); 

그리고 당신의 감사 로그 :

+0

좋은 생각이지만 개발자가 감사 로그 항목에 필요한 매개 변수를 제공하도록 강제하는 방법은 없습니다. – Brian

+0

아니요, 런타임시 실패하는 것 이외에 로그 메시지의 객체 특성을 적용하는 (쉬운) 방법이 없습니다 (원하는 것은 아닐 수 있습니다). 그러나 로깅의 대부분은 어쨌든 모범 사례에 관한 것이므로 일반적인 의미에서 로깅과 관련하여 여기서는별로 다른 점이 없습니다. –

+0

예, 당사의 로깅 만 "모범 사례"이며 고객의 요구 사항에 따라 특정 상황에서 필요하지 않은 경우. 나는 필요한 매개 변수를 추가하기 위해 log4j를 감싸고 있다고 생각합니다. – Brian

4

난 당신이 같은 로그를 생성하는 응용 프로그램 로그의 log4j를 사용할 수 있다고 생각 여러 클래스를 사용하면 설정 파일에서 원하는대로 출력 대상과 형식을 구성 할 수 있습니다.

희망이 도움이됩니다.

0

log4j의 api NDC/MDC를 읽을 수 있습니다. 희망이 당신을 도울 수 있습니다.

1

이 작동합니다는 지금까지 내가있어 최고의 솔루션입니다 ...

(신용 LOG4J: Modify logged message using custom appender에서 hellojava에)

사용자 정의 Log4j의 레이아웃 등 만들기 다음과 같이 :

import java.util.HashMap; 
import java.util.Map; 

import org.apache.log4j.Level; 
import org.apache.log4j.PatternLayout; 
import org.apache.log4j.spi.LoggingEvent; 

public class AuditLayout extends PatternLayout { 
    // Audit Summary Map: 
    // <Level, Counter> 

    private static Map<Level, Integer> auditMap = new HashMap<Level, Integer>(); 

    public static Map<Level, Integer> getAuditMap() { 
     return auditMap; 
    } 

    public static void setAuditMap(Map<Level, Integer> auditMap) { 
     AuditLayout.auditMap = auditMap; 
    } 

    @Override 
    public String format(LoggingEvent event) { 

     if (event.getMessage() != null && event.getMessage() instanceof String) { 
      // Check the message level and update the audit object accordingly: 
      if (!auditMap.containsKey(event.getLevel())) { 
       auditMap.put(event.getLevel(), 1); 
      } else { 
       int i = auditMap.get(event.getLevel());  
       i++; 
       auditMap.put(event.getLevel(), i); 
      } 
     } 
     return super.format(event); 
    } 
} 

이것은 매우 간단한 레이아웃으로 로그 수준을 확인합니다 지도에 요약을 보관합니다. 즉 DEBUG> 2, INFO> 10 등

설정하십시오 log4j.properties 파일 (당신의 펜더 중 하나를 사용)의 새로운 레이아웃 :

# CONSOLE: 
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.Threshold=DEBUG 
# BEFORE::: log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
# AFTER::: 
log4j.appender.CONSOLE.layout=com.ca.utils.AuditLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=%d{MM/dd/yyyy HH:mm:ss} %-5p %c line: %L - %m%n 

지금부터 레이아웃에 auditMap를 사용하여 Logger 객체를 기반으로하는 기본 클래스입니다.

private static AuditLayout auditLayout = null; 
... 
if (log.getRootLogger().getAppender("CONSOLE").getLayout() instanceof AuditLayout) 
    auditLayout = (AuditLayout) log.getRootLogger().getAppender("CONSOLE").getLayout(); 
... 
System.out.println("auditLayout: " + auditLayout.getAuditMap().toString()); 

이 정보가 도움이되기를 바랍니다.