Log4j2를 사용하여 String 키와 Integer 값을 내 로그에 추가하고 싶습니다. 할 방법이 있습니까? 나는 ThreadContext에 속성을 추가 할 때 난 단지 문자열 추가 할 수 있었다 : 문자열 키와 값을하지만 내가 (일부 그래프) 키바에JSONLayout을 사용하여 log4j2 및 사용자 정의 키 값
덕분에, 코비
Log4j2를 사용하여 String 키와 Integer 값을 내 로그에 추가하고 싶습니다. 할 방법이 있습니까? 나는 ThreadContext에 속성을 추가 할 때 난 단지 문자열 추가 할 수 있었다 : 문자열 키와 값을하지만 내가 (일부 그래프) 키바에JSONLayout을 사용하여 log4j2 및 사용자 정의 키 값
덕분에, 코비
을 제시 할 필요가 번호가 도움이되지 않습니다 기본 log4j2 구현에서 값이있는 사용자 정의 필드를 전달할 때 다소 문제가 있음을 발견했습니다. 제 생각에는 현재 자바 로깅 프레임 워크는 구조화 된 로그 이벤트를 작성하는 데 적합하지 않습니다.
해킹이 마음에 들면 https://github.com/skorhone/gelfj-alt/tree/master/src/main/java/org/graylog2/log4j2을 확인할 수 있습니다. 그것은 gelf를 위해 쓰여진 도서관입니다. 제공된 기능 중 하나는 이벤트에서 사용자 정의 필드 (FieldExtractor 참조) 추출을 지원하는 레이아웃 (ExtGelfjLayout)입니다. 하지만 ... 이러한 이벤트를 보내려면 log4j2 위에 자체 로깅 facade를 작성해야합니다.
내장 된 GelfLayout이 유용 할 수 있습니다.
기본 ThreadContext는 String : String 키 - 값만 지원합니다.
log4j2.garbagefree.threadContextMap
을 true
으로 설정하는 것입니다.표준 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)에서 간단히 언급 됨).
Log4j2에는 GelfLayout이 내장되어 있습니다. –
예. 그러나 문자열 이외의 값은 지원하지 않습니다. 스레드 컨텍스트 (컨텍스트 맵)를 사용하여 값을 전달하는 것이 얼마나 비현실적인지는 말할 것도 없습니다. –
지금 무슨 뜻인지 알고 있습니다. 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)에서 간단히 언급합니다. –