3

My app server is loading a log4j2.properties file and I can't find where it is. I'd like to know the complete path of this conf file.

I can easily make log4j2 display the searched configuration files if I start the jvm with the option -Dlog4j.debug like answered in this question, but it does not display the complete path.

With the debug parameter I get this output:

[err] DEBUG StatusLogger Using configurationFactory org.apache.logging.log4j.core.config.ConfigurationFactory$Factory@239c2809
[err] TRACE StatusLogger Trying to find [log4j2-testago service.properties] using context class loader com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.properties] using com.ibm.ws.classloading.internal.AppClassLoader@8bc0851 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.properties] using com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.properties] using ClassLoader.getSystemResource().
[err] TRACE StatusLogger Trying to find [log4j2-testago service.yml] using context class loader com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.yml] using com.ibm.ws.classloading.internal.AppClassLoader@8bc0851 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.yml] using com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.yml] using ClassLoader.getSystemResource().
[err] TRACE StatusLogger Trying to find [log4j2-testago service.yaml] using context class loader com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.yaml] using com.ibm.ws.classloading.internal.AppClassLoader@8bc0851 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.yaml] using com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.yaml] using ClassLoader.getSystemResource().
[err] TRACE StatusLogger Trying to find [log4j2-testago service.json] using context class loader com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.json] using com.ibm.ws.classloading.internal.AppClassLoader@8bc0851 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.json] using com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.json] using ClassLoader.getSystemResource().
[err] TRACE StatusLogger Trying to find [log4j2-testago service.jsn] using context class loader com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.jsn] using com.ibm.ws.classloading.internal.AppClassLoader@8bc0851 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.jsn] using com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.jsn] using ClassLoader.getSystemResource().
[err] TRACE StatusLogger Trying to find [log4j2-testago service.xml] using context class loader com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.xml] using com.ibm.ws.classloading.internal.AppClassLoader@8bc0851 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.xml] using com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-testago service.xml] using ClassLoader.getSystemResource().
[err] TRACE StatusLogger Trying to find [log4j2-test.properties] using context class loader com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414.
[err] TRACE StatusLogger Trying to find [log4j2-test.properties] using com.ibm.ws.classloading.internal.AppClassLoader@8bc0851 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-test.properties] using com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-test.properties] using ClassLoader.getSystemResource().
[err] TRACE StatusLogger Trying to find [log4j2-test.yml] using context class loader com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414.
[err] TRACE StatusLogger Trying to find [log4j2-test.yml] using com.ibm.ws.classloading.internal.AppClassLoader@8bc0851 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-test.yml] using com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-test.yml] using ClassLoader.getSystemResource().
[err] TRACE StatusLogger Trying to find [log4j2-test.yaml] using context class loader com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414.
[err] TRACE StatusLogger Trying to find [log4j2-test.yaml] using com.ibm.ws.classloading.internal.AppClassLoader@8bc0851 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-test.yaml] using com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-test.yaml] using ClassLoader.getSystemResource().
[err] TRACE StatusLogger Trying to find [log4j2-test.json] using context class loader com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414.
[err] TRACE StatusLogger Trying to find [log4j2-test.json] using com.ibm.ws.classloading.internal.AppClassLoader@8bc0851 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-test.json] using com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-test.json] using ClassLoader.getSystemResource().
[err] TRACE StatusLogger Trying to find [log4j2-test.jsn] using context class loader com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414.
[err] TRACE StatusLogger Trying to find [log4j2-test.jsn] using com.ibm.ws.classloading.internal.AppClassLoader@8bc0851 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-test.jsn] using com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414 class loader.
[err] TRACE StatusLogger Trying to find [log4j2-test.jsn] using ClassLoader.getSystemResource().
[err] TRACE StatusLogger Trying to find [log4j2-test.xml] using context class loader com.ibm.ws.classloading.internal.ThreadContextClassLoader@834b414.

Since the last displayed filename is log4j2-test.xml, this is the loaded file. The problem is that if I name my file as log4j2.xml, another configuration named log4j2.properties is loaded before it. And I can't find where this file is! There must be a way to discover where it is loaded from.

neves
  • 33,186
  • 27
  • 159
  • 192
  • When you add a log4j2.xml file on the resources folder It is replaced by a log4j2.properties on the classpath Correct? This issue happens while you are running tests? – vladwoguer Apr 12 '19 at 21:31
  • Please let me now what happens if you try: `-Dlog4j.configurationFile=file:/path/to/file/log4j2.xml` – vladwoguer Apr 12 '19 at 21:40
  • @vladwoguer if I rename the file loaded file above from log4j2-test.xml to log4j2.xml, the log4j2.properties is loaded instead of my file. I just selected a filename that is loaded before the .properties file. – neves Apr 12 '19 at 21:43
  • Did you checked if one of the jars contains a log4j2.properties? – vladwoguer Apr 13 '19 at 12:25

1 Answers1

2

In your program, you can do the following:

URL url = org.apache.logging.log4j.LogManager.class.getResource("/log4j2.properties");
System.out.println(url);

That should display the location of the "log4j2.properties" file at the root of the classpath, using the classloader of the LogManager class.

Remko Popma
  • 35,130
  • 11
  • 92
  • 114