Log4j 2 JSON Configuration
java, json, log4j2, logging
Solution
I found a solution to the problem.
It turns out that the Log4j 2 Configuration doesn't document all the required dependencies:
The JSON support uses the Jackson Data Processor to parse the JSON files. These dependencies must be added to a project that wants to use JSON for configuration:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.7</version>
</dependency>
Problem
I have a configuration in XML that I would like to convert to JSON. The JSON version is not being loaded by Log4j and I cannot find any typos. My test code simply logs an `ERROR` level and a `DEBUG` level message. Only `ERROR` messages are being displayed and no file output is being generated - I'm assuming the framework falls back to the default initialization instead of the JSON file. Note: The log4j2-test.json file is on the classpath. I'm using apache-log4j-2.0-beta9 binary found here. The XML configuration is the following: ``` <?xml version="1.0" encoding="UTF-8"?> <Configuration name="Test"> <Properties> <Property name="Directory">${sys:user.home}/logs</Property> <Property name="Filename">test.log</Property> </Properties> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> <RollingFile name="File" fileName="${Directory}/${Filename}" filePattern="${Directory}/${date:yyyy-MM}/test-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout> <pattern>%d %p %logger{36} [%t] %m%n</pattern> </PatternLayout> <Policies> <SizeBasedTriggeringPolicy size="1 MB"/> </Policies> <DefaultRolloverStrategy max="10"/> </RollingFile> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="Console"/> <AppenderRef ref="File"/> </Root> </Loggers> </Configuration> ``` and the JSON configuration is: ``` { "configuration": { "name": "Default", "properties": { "property": { "name":"Directory", "value":"${sys:user.home}/logs" }, "property": { "name":"FileName", "value":"test.log" } }, "appenders": { "Console": { "name":"Console", "target":"SYSTEM_OUT", "PatternLayout": { "pattern":"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" } }, "RollingFile": { "name":"File", "fileName":"${Directory}/${FileName}", "filePattern":"${Directory}/${date:yyyy-MM}/test-%d{MM-dd-yyyy}-%i.log.gz", "PatternLayout": { "pattern":"%d %p %logger{36} [%t] %m%n" }, "Policies": { "SizeBasedTriggeringPolicy": { "size":"1 MB" } }, "DefaultRolloverStrategy": { "max":"10" } } }, "loggers": { "root": { "level":"debug", "appender-ref": { "ref":"Console" }, "appender-ref": { "ref":"File" } } } } } ```