29

Log4j2 is working nicely with Spring Boot through the log4j2.xml configuration file in the root classpath, exactly as the documentation states.

When trying to move this file to a different location though, I'm not able to pass the new location to Spring at startup. From the documentation:

The various logging systems can be activated by including the appropriate libraries on the classpath, and further customized by providing a suitable configuration file in the root of the classpath, or in a location specified by the Spring Environment property logging.config.

I tried setting the new location with a Java system property

java -jar -Dlogging.config="classpath:/config/log4j2.xml" target/app.jar

or using an external application.properties containing the relevant property

logging.config=classpath:/config/log4j2.xml

But I am regularly greeted by the following error message.

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
6
  • Could you please confirm if /config is in the classpath? if you are using maven based project, put the xml file under src/main/resources Commented Feb 5, 2015 at 16:59
  • The config folder (package) is in the classpath, and it already contains application.yml, that is correctly picked up and succesfully used in the application. Commented Feb 5, 2015 at 17:03
  • Could you please put the xml file in src/main/resources and try so that we can narrow down the issue? Commented Feb 5, 2015 at 17:31
  • If I put the XML file in its right location, the classpath root (src/main/java), it works without problems. I'm not getting what we should check by putting the XML in the src/main/resources folder. What I want to be able to do is to put the log4j2.xml file wherever I want. Commented Feb 6, 2015 at 12:04
  • 1
    Since it is working fine when you put it in src/main/java, it means there is no problem with the configuration. If you want it to work irrespective of the location of the log4j2.xml, you have to make sure that the folder is in classpath. If you are using eclipse, right click on the project -> Build Path -> Configure Build Path to set the classpath. Commented Feb 6, 2015 at 13:01

9 Answers 9

45

As specified in the Spring reference documentation, the logging.config property cannot be set among the application properties, as they are read after the logging has already been initialised.

The solution is to provide the path to the external logging configuration this way:

java -Dlogging.config='/path/to/log4j2.xml' -jar app-current.jar
Sign up to request clarification or add additional context in comments.

4 Comments

There's another solution via the log4j2.component.properties file as described in my answer below which doesn't necessitate providing the config file name via system properties or command line parameters
From the documentation I read: The various logging systems can be activated by including the appropriate libraries on the classpath and can be further customized by providing a suitable configuration file in the root of the classpath or in a location specified by the following Spring Environment property: logging.config. The only exception is for ` logging from @PropertySources in Spring @Configuration file` which is dictated by initialization order. Hence, why "logging.config property cannot be set among the application properties"?
look at this answer
Link in the answer is outdated, new link: docs.spring.io/spring-boot/reference/features/…
17

As mentioned in the log4j2 documentation here, you can include a file named log4j2.component.properties in your resources folder (or anywhere in the classpath) and inside that file, you can provide the name of the file location (or a new file name) like this:

log4j.configurationFile=path/to/log4j2.xml

or

log4j.configurationFile=classpath:log4j2-custom.xml (if the file is on the classpath)

You can alternatively provide the config file location via the context-param fields of web.xml as mentioned here, but I haven't tried that option

(This works with Spring Boot too)

Comments

9

The answer of micpalmia is absolutely correct.

I needed to put the configuration outside the classpath I didn't want to pass the config file as a parameter. So i put a very simple logging configuration in the classpath resources and had the spring boot application reconfigure logging upon start, like so:

@SpringBootApplication
public class Application implements CommandLineRunner {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... param) throws UnsupportedEncodingException {
        Configurator.initialize(null, "config/log4j2.xml");
        // ...
    }
}

This approach has a significant disadvantage: The whole application boot process will not be logged as externally configured. But once the custom code is run the logger works as intended. While you may not, I find this to be a compromise I can live with.

2 Comments

Regarding the boot process, won't using both -Dlog4j.configurationFile and -Dlogging.config take care of this? (It does for me, but I'm not sure we have the same use case.)
Check this answer as well. link
2

I have the same problem in my project, besides log4j2.xml I also need other config files in the class path. Here is my 2 solutions that works:

Soluation 1 : Start spring boot application with org.springframework.boot.loader.JarLauncher

java -classpath SpringBootProject.jar;./config org.springframework.boot.loader.JarLauncher

Solution 2: Write a './config' class path entry in the MANIFEST.MF in the jar

    <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifestEntries>
               <Class-Path>./config/</Class-Path>
            </manifestEntries>
          </archive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>1.5.3.RELEASE</version>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Comments

2

In case of property file:

java -Dlog4j.configuration=file:/path/to/log4j.properties -jar app.jar

To the command line works in Spring Boot 2. Don't forget to add file: before the path.

Comments

1

Another way to do this in Spring boot

 java -jar app.jar --logging.config=/path/to/log4j2.xml

Comments

0

I have working solution to set custom path or change existing file path for logging file. If you have configured log4j2.xml file, open it and see where you have to do one line change to config log file path.enter image description here

2 Comments

This doesn't answer the question. The question was asking about the location of the log4j configuration file (log4j.xml) rather than the file for writing the log statements to
This also looks a whole lot like AnyPoint Studio and not a "normal" Java Application
0

If you try to rename the log4j2.xml file other than the default name. In order to load the file. For a spring boot application in application.properties file add below property this would work

logging.config=classpath:logfilename.xml

Comments

0

After a lot of struggle I found that the only thing that works in all cases (independent of used builder, also with .jar however it is started) is to set log4j.configurationFile system variable programmatically to load from start folder (instead of classpath / .jar resource).

In start class use private static Logger log; instead of private static final Logger log = LogManager.getLogger(<class>.class); used in other classes.

In start class do not initialise calls variables at declaration but do that in the main method after log initialization (otherwise you might miss logs).

First thing in main(String[] args) is to set log4j.configurationFile and initialise log after that:

System.getProperties().setProperty("log4j.configurationFile", "log4j2.xml");
log = LogManager.getLogger(TSVConverter.class);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.