I am trying to initialize log4j2 in my servlet application (apache-tomcat 9).
This code
private static Logger logger = LogManager.getLogger(MyClass.class) ;
...
Enumeration enumerator = LogManager.getLoggerRepository().getCurrentLoggers() ;
while(enumerator.hasMoreElements()) {
System.out.println("Logger ->"+((Logger)enumerator.nextElement()).getLevel().toString()) ;
}
enumerator = LogManager.getLoggerRepository().getCurrentLoggers() ;
while(enumerator.hasMoreElements()) {
System.out.println("Logger ->"+((Logger)enumerator.nextElement()).getName().toString()) ;
}
prints the below on the console
Logger ->ERROR
Logger ->DEBUG
Logger ->my.package.first.MyClass
Logger ->root
In my code I have the log4j2.properties in this folder
src/main/webapp/WEB-INF/
This is my log4j2.properties content
# Set root logger level to DEBUG and its only appender to Console
log4j.rootLogger=DEBUG, Console
# Console appender configuration
log4j.appender.Console.type=Console
log4j.appender.Console.name=STDOUT
log4j.appender.Console.layout.type=PatternLayout
log4j.appender.Console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1} - %m%n
# Define appenders
appender.console.type = Console
appender.console.name = CONSOLE
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=blue}
appender.file.type = File
appender.file.name = FILE
appender.file.fileName = logs/application.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
# Define loggers
rootLogger.level = INFO
rootLogger.appenderRef.console.ref = CONSOLE
rootLogger.appenderRef.file.ref = FILE
logger.my.package.first.name = my.package.first
logger.my.package.first.level = DEBUG
logger.my.package.first.appenderRef.file.ref = FILE
logger.my.package.second.name = my.package.second
logger.my.package.second.level = DEBUG
logger.my.package.second.appenderRef.file.ref = FILE
My src/main/webapp/WEB-INF/web.xml
has the following content
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>log4j2.properties</param-value>
</context-param>
<context-param>
<param-name>log4j2.debug</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>log4j2.verbose</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>log4j.shutdownHookEnabled</param-name>
<param-value>true</param-value>
</context-param>
I have downloaded the following files and copied it to the tomcat/lib folder
- log4j-web-2.24.0
- log4j-core-2.24.0
- log4j-api-2.24.0
- log4j-jul-2.24.0
I have referred to many links on SO
- One link hinted that unable to find log4j2.properties file, so I copied log4j2.properties to lib, conf, webapps, webapps/myapp, webapps/myapp/classes folders and checked, no luck same error
- Other links hinted that content may in incorrect
Why is my log4j2.properties not picking up Debug for my.package
?
1
I had to make 3 corrections
- remove the log4j2.properties file from the WEB-INF folder and place it in the webapp folder. So that it shows up in my tomcat/webapps/myapp folder directly
- I had to change my log4j2.properties
from
logger.my.package.first.name = my.package.first
logger.my.package.first.level = DEBUG
logger.my.package.first.appenderRef.file.ref = FILE
logger.my.package.second.name = my.package.second
logger.my.package.second.level = DEBUG
logger.my.package.second.appenderRef.file.ref = FILE
to
logger.myPackageFirst.name = my.package.first
logger.myPackageFirst.level = DEBUG
logger.myPackageFirst.appenderRef.file.ref = FILE
logger.myPackageSecond.name = my.package.second
logger.myPackageSecond.level = DEBUG
logger.myPackageSecond.appenderRef.file.ref = FILE
this answer helped me, between logger
and name
there should only be oneWord
Also my WEB-INF/web.xml
looks like this now..
<web-app ....>
...
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<context-param>
<param-name>isLog4jAutoInitializationDisabled</param-name>
<param-value>true</param-value>
</context-param>
<filter>
<filter-name>log4jServletFilter</filter-name>
<filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>log4jServletFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
<dispatcher>ASYNC</dispatcher> <!-- Servlet 3.0 w/ disabled auto-initialization only; not supported in 2.5 -->
</filter-mapping>
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>log4j2.properties</param-value>
</context-param>
<context-param>
<param-name>log4j2.debug</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>log4j2.verbose</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>log4j.shutdownHookEnabled</param-name>
<param-value>true</param-value>
</context-param>
Edit
- I did not need the 4 jar files in the
lib
folder of tomcat. Getting the 4 jars in my maven pom dependencies were enough.