Das eingebaute GelfLayout kann nützlich sein.
Es stimmt, dass der Standard-ThreadContext nur String: String-Schlüsselwerte unterstützt. Die Arbeit in LOG4J2-1648 ermöglicht es Ihnen, andere Arten in ThreadContext zu verwenden:
- Log4j Weiterempfehlen ThreadContext Karte Implementierung zu verwenden, die den ObjectThreadContextMap-Schnittstelle implementiert. Der einfachste Weg, dies zu erreichen, ist das Setzen der Systemeigenschaft
log4j2.garbagefree.threadContextMap
auf true
.
Die Standard-ThreadContext-Fassade hat nur Methoden für Strings, daher müssen Sie Ihre eigene Fassade erstellen. Die unten sollte funktionieren:
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();
}
}
Es ist möglich, ThreadContext insgesamt durch die Injektion von Schlüssel-Wert-Paaren aus einer anderen Quelle in die LogEvent zu vermeiden. Dies wird (kurz) unter Custom Context Data Injectors (http://logging.apache.org/log4j/2.x/manual/extending.html#Custom_ContextDataInjector) erwähnt.
Log4j2 hat eine eingebaute GelfLayout –
Ja, aber es unterstützt keine anderen Werte als Strings. Ganz zu schweigen davon, wie unintuitiv es ist, Werte mit Threadkontext (Kontextmap) zu übergeben –
Ich sehe was du jetzt meinst. Es gibt einige laufende Arbeiten zur Unterstützung anderer Typen in ThreadContext: https://issues.apache.org/jira/browse/LOG4J2-1648 und https://issues.apache.org/jira/browse/LOG4J2-1629. Es ist möglich, ThreadContext vollständig zu vermeiden, indem Schlüssel/Wert-Paare aus einer anderen Quelle in das LogEvent eingefügt werden. Dies wird (kurz) unter Custom Context Data Injectors (http://logging.apache.org/log4j/2.x/manual/extending.html#Custom_ContextDataInjector) erwähnt. –