Java log4j2 configuration using different files for different log levels
14:15 13 Jan 2026

i have a configuration for log4j2 as a property file which looks like this:

log4j2.properties

property.pattern = %d [%t] %F %-5L %-5p %c - %m%n

appender.0.type = Console
appender.0.name = ALL_LOG_CONSOLE
appender.0.layout.type = PatternLayout
appender.0.layout.pattern = ${pattern}

appender.1.type = File
appender.1.name = ALL_LOG_FILE
appender.1.fileName = logs/all.log
appender.1.layout.type = PatternLayout
appender.1.layout.pattern = ${pattern}

appender.2.type = File
appender.2.name = OFF_LOG_FILE
appender.2.fileName = logs/off.log
appender.2.layout.type = PatternLayout
appender.2.layout.pattern = ${pattern}

appender.3.type = File
appender.3.name = FATAL_LOG_FILE
appender.3.fileName = logs/fatal.log
appender.3.layout.type = PatternLayout
appender.3.layout.pattern = ${pattern}

appender.4.type = File
appender.4.name = ERROR_LOG_FILE
appender.4.fileName = logs/error.log
appender.4.layout.type = PatternLayout
appender.4.layout.pattern = ${pattern}

appender.5.type = File
appender.5.name = WARN_LOG_FILE
appender.5.fileName = logs/warn.log
appender.5.layout.type = PatternLayout
appender.5.layout.pattern = ${pattern}

appender.6.type = File
appender.6.name = INFO_LOG_FILE
appender.6.fileName = logs/info.log
appender.6.layout.type = PatternLayout
appender.6.layout.pattern = ${pattern} 

appender.7.type = File
appender.7.name = DEBUG_LOG_FILE
appender.7.fileName = logs/debug.log
appender.7.layout.type = PatternLayout
appender.7.layout.pattern = ${pattern}

appender.8.type = File
appender.8.name = TRACE_LOG_FILE
appender.8.fileName = logs/trace.log
appender.8.layout.type = PatternLayout
appender.8.layout.pattern = ${pattern}

logger.0.name = de.hoelzer.all.log.console
logger.0.level = ALL
logger.0.appenderRef.0.ref = ALL_LOG_CONSOLE
logger.0.appenderRef.0.level = ALL

logger.1.name = de.hoelzer.all.log.file
logger.1.level = ALL
logger.1.appenderRef.0.ref = ALL_LOG_CONSOLE
logger.1.appenderRef.0.level = ALL

logger.2.name = de.hoelzer.off.log.file
logger.2.level = OFF
logger.2.appenderRef.0.ref = OFF_LOG_FILE
logger.2.appenderRef.0.level = OFF

logger.3.name = de.hoelzer.fatal.log.file
logger.3.level = FATAL
logger.3.appenderRef.0.ref = FATAL_LOG_FILE
logger.3.appenderRef.0.level = FATAL

logger.4.name = de.hoelzer.error.log.file
logger.4.level = ERROR
logger.4.appenderRef.0.ref = ERROR_LOG_FILE
logger.4.appenderRef.0.level = ERROR

logger.5.name = de.hoelzer.warn.log.file
logger.5.level = WARN
logger.5.appenderRef.0.ref = WARN_LOG_FILE
logger.5.appenderRef.0.level = WARN

logger.6.name = de.hoelzer.info.log.file
logger.6.level = INFO
logger.6.appenderRef.0.ref = INFO_LOG_FILE
logger.6.appenderRef.0.level = INFO

logger.7.name = de.hoelzer.debug.log.file
logger.7.level = DEBUG
logger.7.appenderRef.0.ref = DEBUG_LOG_FILE
logger.7.appenderRef.0.level = DEBUG

logger.8.name = de.hoelzer.trace.log.file
logger.8.level = TRACE
logger.8.appenderRef.0.ref = TRACE_LOG_FILE
logger.8.appenderRef.0.level = TRACE

rootLogger.level = ALL
rootLogger.appenderRef.0.ref = ALL_LOG_CONSOLE
rootLogger.appenderRef.0.level = ALL
rootLogger.appenderRef.1.ref = ALL_LOG_FILE
rootLogger.appenderRef.1.level = ALL
rootLogger.appenderRef.2.ref = OFF_LOG_FILE
rootLogger.appenderRef.2.level = OFF
rootLogger.appenderRef.3.ref = FATAL_LOG_FILE
rootLogger.appenderRef.3.level = FATAL
rootLogger.appenderRef.4.ref = ERROR_LOG_FILE
rootLogger.appenderRef.4.level = ERROR
rootLogger.appenderRef.5.ref = WARN_LOG_FILE
rootLogger.appenderRef.5.level = WARN
rootLogger.appenderRef.6.ref = INFO_LOG_FILE
rootLogger.appenderRef.6.level = INFO
rootLogger.appenderRef.7.ref = DEBUG_LOG_FILE
rootLogger.appenderRef.7.level = DEBUG
rootLogger.appenderRef.8.ref = TRACE_LOG_FILE
rootLogger.appenderRef.8.level = TRACE

Running with this configuration i get all logfiles created in the directory log/.

all.log contains all level messages.

debug.log contains INFO level messages even if no debug calls was made to log.

error.log, fatal.log, off.log and warn.log are empty.

info.log contains only INFO level messages but the format is off a bit.

trace.log contians INFO and TRACE level messages.

Question is why trace.log and debug.log contains INFO messages?

java logging configuration log4j2 levels