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?