2013-04-08 11 views
8

현재 모든 출력을 로그 파일에 작성해야하는 프로그램을 작성 중입니다.다중 매개 변수 로깅

레벨, 메시지, 객체 값, 다른 메시지, 정수 값, 다른 메시지 및 다른 정수 값을 지정한 출력과 함께 제공해야하는 로그 메서드를 작성해야합니다. . 이 작업을 수행하는 로그 메서드를 찾을 수 없습니다. Java.util.logging을 사용하고 있습니다. 이것이 가능한가?

+0

고려 Log4J를 HTTP하는 데 도움이 /logging.apache.org/log4j/2.x/ – Mirco

+1

@ verbose-mode 이유가 무엇입니까? 자바 유틸리티 로깅은 필요한 모든 작업을 수행하며 사용하기가 더 쉽습니다. 내가보기에는 당신의 제안은 KISS (Keep it Simple S ...) 원칙을 어기는 것입니다. – Martin

답변

13

나는 당신은 출력 메시지 형식을 작성해야합니다, 당신은 아래의 형식 FINE, Message1, object.GetValue(), Message2,1에서 로그 형식을 필요로 Message3,2

가정

logger.log(Level.INFO, "{0},{1},{2},{3},{4},{5}",new Object[]{Message1,object.getValue(),Message2,1,Message3,2}); 

지금 당신은 포맷터 클래스를 이제 새로 생성 된 포맷

0123을 설정

public class DataFormatter extends Formatter { 

@Override 
public synchronized String format(LogRecord record) { 
    String formattedMessage = formatMessage(record); 
    String throwable = ""; 
    String outputFormat = "%1$s, %2$s \n %3$s"; //Also adding for logging exceptions 
    if (record.getThrown() != null) { 
     StringWriter sw = new StringWriter(); 
     PrintWriter pw = new PrintWriter(sw); 
     pw.println(); 
     record.getThrown().printStackTrace(pw); 
     pw.close(); 
     throwable = sw.toString(); 
    } 
    return String.format(outputFormat,record.getLevel().getName(),formattedMessage,throwable); 
} 
} 

를 확장하여 사용자 정의 포매터를 작성해야

for(int i=0;i<logger.getHandlers().length;i++) 
     logger.getHandlers()[i].setFormatter(new DataFormatter()); 
9

내 프로젝트에서 java.util.logging.Logger`를 사용하는 것이 더 낫기 때문에 그것은 상당히 오래된 주제입니다. 어쨌든, 제 2 센트입니다.

람다는 응용 프로그램 전반의 재사용으로 이익을 얻지 않는 한, 여러 사용자 정의 매개 변수에 대한이 상용구 확장 기능을 다소간 쓸모 없게 만듭니다. 간단한 시나리오에서는 로그 메시지가 삽입되는 코드 부분에 맞게 조정되므로 String.format()은 대개 훨씬 쉽고 유연합니다.

Java 8 및 lambda 이전에는 Formatter이 메시지 구성을 연기 할 수있는 유일한 방법이었습니다. 유일한 대안은 수준에 따라 loggable 확인이 이루어지기 전에 미리 로그 할 메시지를 구성하는 것이 었습니다.
Java 8 람다을 사용하면 loggable 검사 후에 문자열 형식을 연기 할 수 있지만 여전히 원래 메서드 컨텍스트에 액세스 할 수 있습니다. 유일한 작은 단점은 람다 제한으로 인해 모든 액세스 된 필드가 최종해야한다는 것입니다. 여기

아주 간단한 미리보기 :/:

final String val1 = "lambda expression log message"; 
final Level level = Level.INFO; 
Logger.getGlobal().log(level,() -> 
     String.format("Hello, I'm a %s, evaluated after %s loggable check.", val1, level) 
); 
Logger.getGlobal().log(level, new RuntimeException(),() -> 
     String.format("Hello, I'm a %s with a stack trace, evaluated after %s loggable check.", val1, level) 
); 

희망이 또한 싶은 당신의 일부가 내장 된 로깅 :-)

건배 벤를 사용하는