Why is the Log4j rootLogger
in my application not filtering log events according to level? In my log4j.properties
, I have several loggers:
log4j.rootLogger=info,stdout
log4j.logger.com.name.myapp=debug,myapp
log4j.logger.org.castor=debug,castor
log4j.logger.org.exolab.castor=debug,castor
log4j.logger.org.hibernate=debug,hibernate
log4j.logger.org.springframework=debug,spring
Each of the loggers receive and record numerous log events at levels DEBUG
and above, which is what I expect and desire. The rootLogger
, however, despite being set to level INFO
, is displaying all of these events, too, including the DEBUG
events, which is not what I expect and not what I desire. Instead, I would expect it to filter the DEBUG
events, but display only the events at level INFO
and higher (WARN
, ERROR
, and FATAL
), which is also what I want. Why is rootLogger displaying all of the events?
To retrieve the rootlogger, are you using
Logger.getRootLogger()
? If not, you may not be getting the real root logger. If so, make sure the Threshold ofstdout
isnt at debug; the Threshold of appenders override that of the logger Levels.Check out the inheritance described in the intro. If you specify a level at the package level, it won't inherit the root logger's level. You're using debug in the packages you specify, not info. Specifying the level overrides whatever has been inherited.
If you want to inherit the root logger's level, get rid of the level specification in your logger configurations.
See this answer to a similar question about logger chaining in Log4j:
This means that no matter to what level you set the threshold of the root logger, it will always accept and output the log event that any other logger accepts, unless you disable chaining for that child logger or explicitly set the threshold of its appender to a higher level.
So, in this case, there are two ways that you can prevent root logger from capturing the events from the other loggers. The first is the more selective approach of disabling log event chaining:
The second way is simpler, but more restrictive since it suppresses all events on the console that are lower than
INFO
(DEBUG
andTRACE
):