2016-06-01 1 views
0

컨트롤러 타워와 같은 프로젝트에서 log4j2를 사용하고 있습니다. 그리고 websocket 이벤트, SNMP 트랩 이벤트, 데이터베이스에 삽입하기 위해 사용자 정의 로그 애 퍼더를 사용하십시오. log4j2를 사용log4j2를 사용하여 사용자 정의 appender에 몇 가지 추가 정보 (객체)를 보내는 방법은 무엇입니까?

I 오류 코드, 소스 노드, SNMP의 Oid, 작업 ID, 등 같은 펜더 사용자 지정 로그에 더 많은 정보]를 보내려면 ...

, 펜더 로그인 할 때 더 많은 정보를 보낼 수있는 방법이있다 ? 다만 이런

:

로깅 부분 : logger.info (customObject);

SNMP 펜더 : customObject에서 메시지가, customObject에서 OID 얻을

웹 소켓의 펜더 : customObject에서 메시지가, customObject에서 작업 ID 얻을

데이터베이스 펜더 : customObject에서 오류 코드를 얻을 , customObject에서 메시지를 받으십시오.

영어 불쌍한 분들에게 죄송합니다. 및 모든 도움을 주시면 감사하겠습니다.

+0

는 [스레드 컨텍스트]처럼 보이는 좋아 (https://logging.apache.org/log4j/2.x/manual/thread-context.html) 그것을 할 수 있습니다. 하지만 스레드 물고기 태그 지정을 위해 설계되었습니다. –

답변

-3

Log4j는 항상 문자열을 보내고 직렬화 기능을 제공하지 않습니다.

log4j를 호출하기 전에 개체를 serialize하는 것이 좋습니다. 기술과 함께 serilization 형식을 사용할 수 있습니다.

아마도 jackson 라이브러리를 사용하여 객체를 JSOJN에 직렬화 할 수 있습니다.

+0

Log4j 2를 사용하면 문자열뿐만 아니라 모든 객체를 기록 할 수 있습니다. 이것은 Log4j 2 API가 slf4j보다 우수한 이유 중 하나입니다. –

2

해결책을 찾았습니다. log4j2에는 Message 인터페이스가 있습니다. 및이 인터페이스를 구현하여 맞춤형 정보를 보낼 수 있습니다. 단지

public class CustomLogMessage implements Message { 
    private String oid; 
    private long errorCode; 
    private String msg; 
.... 
} 

같은 사용자 정의 로그 펜더에, 나는 CustomLogMessage 메시지를 캐스팅하고 정보를 얻을 수 있습니다. 그냥

@Override 
public void append(LogEvent event) { 
    Message message = event.getMessage(); 
    if(message instanceof CustomLogMessage) { 
     CustomLogMessage customLogMessage = (CustomLogMessage) message; 
     System.out.println(customLogMessage.getOid()); 
     System.out.println(customLogMessage.getErrorCode()); 
     System.out.println(customLogMessage.getFormattedMessage()); 
    } 
} 
+0

아주 좋습니다. SLF4J는 이와 같은 것을 제공하지 않습니다. –