Kobi Harari
Kobi Harari

Reputation: 11

log4j2 and custom key value using JSONLayout

I would like to add to my log a String key and an Integer value using Log4j2. Is there a way to do it? when I added properties to the ThreadContext I was able to add only String:String key and values but this does not help I have numbers that I need to present in Kibana (some graphs)

thanks, Kobi

Upvotes: 1

Views: 3383

Answers (2)

Remko Popma
Remko Popma

Reputation: 36754

The built-in GelfLayout may be useful.

It's true that the default ThreadContext only supports String:String key-values. The work done in LOG4J2-1648 allows you to use other types in ThreadContext:

  1. Tell Log4j to use a ThreadContext map implementation that implements the ObjectThreadContextMap interface. The simplest way to accomplish this is by setting system property log4j2.garbagefree.threadContextMap to true.
  2. The standard ThreadContext facade only has methods for Strings, so you need to create your own facade. The below should work:

    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();
      }
    }
    

It is possible to avoid ThreadContext altogether by injecting key-value pairs from another source into the LogEvent. This is (briefly) mentioned under Custom Context Data Injectors (http://logging.apache.org/log4j/2.x/manual/extending.html#Custom_ContextDataInjector).

Upvotes: 1

Sami Korhonen
Sami Korhonen

Reputation: 1303

I found default log4j2 implementation somewhat problematic for passing custom fields with values. In my opinion current java logging frameworks are not well suited for writing structured log events

If you like hacks, you can check https://github.com/skorhone/gelfj-alt/tree/master/src/main/java/org/graylog2/log4j2 . It's a library written for gelf. One of provided features is a layout (ExtGelfjLayout) that supports extracting custom fields (See FieldExtractor) from events. But... im order to send such event, you need to write your own logging facade on top of log4j2.

Upvotes: 0

Related Questions