I’m having trouble understanding the relation between additivity, category logging level and appender threshold.
here’s the scenario (my log4j.properties file):
log4j.category.GeneralPurpose.classTypes=INFO, webAppLogger
log4j.additivity.GeneralPurpose.classTypes=true
log4j.category.GeneralPurpose=ERROR, defaultLogger
log4j.additivity.GeneralPurpose=false
log4j.appender.webAppLogger=org.apache.log4j.RollingFileAppender
log4j.appender.webAppLogger.File=webapps/someWebApp/logs/webApp.log
log4j.appender.webAppLogger.MaxFileSize=3000KB
log4j.appender.webAppLogger.MaxBackupIndex=10
log4j.appender.webAppLogger.layout=org.apache.log4j.PatternLayout
log4j.appender.webAppLogger.layout.ConversionPattern=%d [%t] (%F:%L) %-5p - %m%n
log4j.appender.webAppLogger.Encoding=UTF-8
log4j.appender.defaultLogger=org.apache.log4j.RollingFileAppender
log4j.appender.defaultLogger.File=logs/server.log
log4j.appender.defaultLogger.MaxFileSize=3000KB
log4j.appender.defaultLogger.MaxBackupIndex=10
log4j.appender.defaultLogger.layout=org.apache.log4j.PatternLayout
log4j.appender.defaultLogger.layout.ConversionPattern=%d [%t] (%F:%L) %-5p - %m%n
log4j.appender.defaultLogger.Encoding=UTF-8
insights:
category GeneralPurpose.classTypes is INFO
category GeneralPurpose.classTypes has additivity TRUE
category GeneralPurpose is ERROR
category GeneralPurpose has additivity FALSE
with the current configuration I would have assumed that INFO messages sent to category GeneralPurpose.classTypes.* would be only logged to webAppLogger since the parent logger (category) is set with ERROR level logging. However, this is not the case, the message is logged twice (one in each log file). Looks like the ERROR logging level for the parent category is not taken into consideration when the event is sent as part of additivity.
- is my observation correct or am I missing something ?
- how should I alter the configuration in order to achieve only ERROR level loggings in server.log?
The level of a category determines whether an event originating in that category is logged or discarded; it doesn’t have any filtering effect on events that are received from child categories.
Since
GeneraPurpose.classTypeshas a level ofINFO, any events less severe thanINFOwill be discarded, but the remainder will be preserved.Since
GeneralPurpose.classTypeshas an additivity oftrue, enabled events will be passed on to its parent categories in the hierarchy—specifically includingGeneralPurpose.Since the threshold is not set on the
webAppLogger, it will log all events it receives.Since the threshold is not set on the
defaultLogger, it will log all events it receives.If you want the
defaultLoggerto include onlyERRORevents or worse, set its threshold toERROR.