Search code examples
javalogginglog4jlog4j2

LOG4J json-template-layout - Adding all headers


I've been trying to add http headers under a header object and I cant seem to get it working how I want it to with the json template layout. The below method works, but it also adds all elements in the MDC.

  "headers": {
    "$resolver": "mdc",
  },
ThreadContext.put("Host", request.getRemoteHost);
ThreadContext.put("Method", request.getMethod);

I can see in the docs that LOG4J Map Resolver Template but I cant figure out how to use it. It looks like it referencing an object, but I cant pass an object to the TheadContext?

Desired output

{
 "timestamp": "2023-10-27T17:00:00.000Z",
 "level" "INFO",
 "headers" : {
    "host": "localhost",
    "method": "POST"
 },
 "logger": "my_logger"
}

I can create a MapMessage and parse it to the log()


Solution

  • The following template should get the job done:

    {
      "timestamp": {
        "$resolver": "timestamp",,
        "pattern": {
          "format": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
          "timeZone": "UTC"
        }
      },
      "level": {
        "$resolver": "level",
        "field": "name"
      },
      "headers": {
        "host": {
          "$resolver": "mdc",
          "key": "Host"
        },
        "method": {
          "$resolver": "mdc",
          "key": "Method"
        }
      },
      "logger": {
        "$resolver": "logger",
        "field": "name"
      }
    }