How to modify log4j JsonLayout field names

java, json, log4j

Solution

user JsonTemplateLayout:

Pom.xml:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-layout-template-json</artifactId>
    <version>2.14.1</version>
</dependency>

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <JsonTemplateLayout eventTemplateUri="classpath:JsonTemplateLayout.json" />
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="com.logging.a.b" level="error" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
    </Loggers>
</Configuration>

src/main/resources/JsonTemplateLayout.json:

{
    "version": "1.1",
    "hostName": "${hostName}",
    "field1": "${env:JAVA_HOME}",
    "field2": "${sys:os.name}",
    "time": {
        "$resolver": "timestamp",
        "pattern": {
            "format": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
            "timeZone": "UTC"
        }
    },
    "level": {
        "$resolver": "level",
        "field": "name"
    },
    "loggerName": {
        "$resolver": "logger",
        "field": "name"
    },
    "message": {
        "$resolver": "message",
        "stringified": true
    },
    "source": {
        "class": {
            "$resolver": "source",
            "field": "className"
        },
        "method": {
            "$resolver": "source",
            "field": "methodName"
        },
        "file": {
            "$resolver": "source",
            "field": "fileName"
        },
        "line": {
            "$resolver": "source",
            "field": "lineNumber"
        }
    },
}

You can add and remove fields, or change name of fields by changing the above template file. See more examples here: json template file

Problem

I have configured log4j 2 with this config file to write my `MapMessage` to console: ``` <?xml version="1.0" encoding="UTF-8"?> <Configuration status="ERROR"> <Properties> <Property name="disableThreadContext">true</Property> <Property name="disableThreadContextStack">true</Property> <Property name="disableThreadContextMap">true</Property> <Property name="log4j2.disable.jmx">true</Property> </Properties> <Appenders> <Console name="CONSOLE" target="SYSTEM_OUT"> <JsonLayout locationInfo="true" complete="false" /> </Console> </Appenders> <Loggers> <logger name="ir.cvas.logger" level="info" /> <Root level="warn"> <AppenderRef ref="CONSOLE"/> </Root> </Loggers> </Configuration> ``` The output of this configuration is like: ``` { "timeMillis" : 1404902036494, "thread" : "main", "level" : "ERROR", "loggerName" : "ir.cvas.log4j.json.Main", "message" : "description=\"I'm so fucked...\" id=\"12312312312312321\"", "endOfBatch" : false, "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger", "source" : { "class" : "ir.cvas.log4j.json.Main", "method" : "main", "file" : "Main.java", "line" : 24 } } ``` - I need to remove some fields from output such as `endOfBatch` and `loggerFqcn`. Is it possible? - I don't really like how `MapMessage` is converted. I would want something like Json object instead of single string, Something like thisthis: `"message": { "description"="I'm so fucked...", "id"="12312312312312321" }` or at least flatten `MapMessage` fields in to log message. - I want to convert timestamp field to unix time with milliseconds removed. Can anyone help?

Original source

Related problems