2017-03-03 3 views
0

Log4j2를 사용하여 String 키와 Integer 값을 내 로그에 추가하고 싶습니다. 할 방법이 있습니까? 나는 ThreadContext에 속성을 추가 할 때 난 단지 문자열 추가 할 수 있었다 : 문자열 키와 값을하지만 내가 (일부 그래프) 키바에JSONLayout을 사용하여 log4j2 및 사용자 정의 키 값

덕분에, 코비

답변

0

을 제시 할 필요가 번호가 도움이되지 않습니다 기본 log4j2 구현에서 값이있는 사용자 정의 필드를 전달할 때 다소 문제가 있음을 발견했습니다. 제 생각에는 현재 자바 로깅 프레임 워크는 구조화 된 로그 이벤트를 작성하는 데 적합하지 않습니다.

해킹이 마음에 들면 https://github.com/skorhone/gelfj-alt/tree/master/src/main/java/org/graylog2/log4j2을 확인할 수 있습니다. 그것은 gelf를 위해 쓰여진 도서관입니다. 제공된 기능 중 하나는 이벤트에서 사용자 정의 필드 (FieldExtractor 참조) 추출을 지원하는 레이아웃 (ExtGelfjLayout)입니다. 하지만 ... 이러한 이벤트를 보내려면 log4j2 위에 자체 로깅 facade를 작성해야합니다.

+0

Log4j2에는 GelfLayout이 내장되어 있습니다. –

+0

예. 그러나 문자열 이외의 값은 지원하지 않습니다. 스레드 컨텍스트 (컨텍스트 맵)를 사용하여 값을 전달하는 것이 얼마나 비현실적인지는 말할 것도 없습니다. –

+0

지금 무슨 뜻인지 알고 있습니다. ThreadContext의 다른 유형을 지원하는 몇 가지 지속적인 작업이 있습니다 (https://issues.apache.org/jira/browse/LOG4J2-1648 및 https://issues.apache.org/jira/browse/LOG4J2-1629). 또 다른 소스의 키 - 값 쌍을 LogEvent에 삽입하여 ThreadContext를 완전히 피할 수 있습니다. 이 내용은 사용자 정의 컨텍스트 데이터 인젝터 (http://logging.apache.org/log4j/2.x/manual/extending.html#Custom_ContextDataInjector)에서 간단히 언급합니다. –

0

내장 된 GelfLayout이 유용 할 수 있습니다.

기본 ThreadContext는 String : String 키 - 값만 지원합니다.

  1. 는 ObjectThreadContextMap 인터페이스를 구현하는 ThreadContext지도 구현을 사용하여 Log4j 알려주기 : LOG4J2-1648에서 수행 작업은 ThreadContext의 다른 유형을 사용할 수 있습니다. 이 작업을 수행하는 가장 간단한 방법은 시스템 속성 log4j2.garbagefree.threadContextMaptrue으로 설정하는 것입니다.
  2. 표준 ThreadContext Facade는 String에 대한 메소드 만 가지고 있으므로, 사용자 자신의 facade를 만들어야합니다. 아래 작동해야

    public class ObjectThreadContext { 
        public static boolean isSupported() { 
         return ThreadContext.getThreadContextMap() instanceof ObjectThreadContextMap; 
        } 
    
        public static Object getValue(String key) { 
         return getObjectMap().getValue(key); 
        } 
    
        public static void putValue(String key, Object value) { 
         getObjectMap().putValue(key, value); 
        } 
    
        private static ObjectThreadContextMap getObjectMap() { 
         if (!isSupported()) { throw new UnsupportedOperationException(); } 
         return (ObjectThreadContextMap) ThreadContext.getThreadContextMap(); 
        } 
    } 
    

LOGEVENT으로 다른 소스로부터 키 - 값 쌍을 주입함으로써 ThreadContext 모두를 회피 할 수있다. 이것은 (사용자 정의 컨텍스트 데이터 인젝터 (http://logging.apache.org/log4j/2.x/manual/extending.html#Custom_ContextDataInjector)에서 간단히 언급 됨).