My very simple Java app is logging to both the file appender and the console appender where I have only defined a file appender.
Here is my log4j2.properties
file:
appender.file.type = File
appender.file.name = fileLogger
appender.file.fileName=ExampleClass.log
appender.file.layout.type = PatternLayout
appender.file.layout.Pattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
logger.ExampleClass.name = ExampleClass
logger.ExampleClass.level = trace
logger.ExampleClass.appenderRef.file.ref = fileLogger
Here is the Java source code that attempts to log:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ExampleClass {
private static Log log = LogFactory.getLog(ExampleClass.class);
public static void main(String[] args) {
log.info("info in the main method");
log.error("error in the main method");
}
}
Here are the VM arguments passed to the JVM:
-Dlog4j.configurationFile=log4j2.properties -Dlog4j2.debug
Here are the JARs on the CLASSPATH:
commons-logging-1.2.jar
log4j-api-2.17.2.jar
log4j-core-2.17.2.jar
log4j-jcl-2.17.2.jar
Here is the Console log (from Eclipse) when the Java code is run:
DEBUG StatusLogger Using ShutdownCallbackRegistry class org.apache.logging.log4j.core.util.DefaultShutdownCallbackRegistry
DEBUG StatusLogger Took 0.271365 seconds to load 222 plugins from jdk.internal.loader.ClassLoaders$AppClassLoader@73d16e93
DEBUG StatusLogger PluginManager 'Lookup' found 16 plugins
DEBUG StatusLogger AsyncLogger.ThreadNameStrategy=UNCACHED (user specified null, default is UNCACHED)
TRACE StatusLogger Using default SystemClock for timestamps.
DEBUG StatusLogger org.apache.logging.log4j.core.util.SystemClock supports precise timestamps.
DEBUG StatusLogger PluginManager 'Lookup' found 16 plugins
DEBUG StatusLogger PluginManager 'Converter' found 45 plugins
DEBUG StatusLogger Starting OutputStreamManager SYSTEM_OUT.false.false-1
DEBUG StatusLogger Starting LoggerContext[name=73d16e93, org.apache.logging.log4j.core.LoggerContext@4d826d77]...
DEBUG StatusLogger Reconfiguration started for context[name=73d16e93] at URI null (org.apache.logging.log4j.core.LoggerContext@4d826d77) with optional ClassLoader: null
DEBUG StatusLogger PluginManager 'Lookup' found 16 plugins
DEBUG StatusLogger PluginManager 'ConfigurationFactory' found 4 plugins
DEBUG StatusLogger PluginManager 'Lookup' found 16 plugins
DEBUG StatusLogger PluginManager 'Lookup' found 16 plugins
DEBUG StatusLogger Missing dependencies for Yaml support, ConfigurationFactory org.apache.logging.log4j.core.config.yaml.YamlConfigurationFactory is inactive
DEBUG StatusLogger PluginManager 'Lookup' found 16 plugins
DEBUG StatusLogger Missing dependencies for Json support, ConfigurationFactory org.apache.logging.log4j.core.config.json.JsonConfigurationFactory is inactive
DEBUG StatusLogger PluginManager 'Lookup' found 16 plugins
DEBUG StatusLogger Using configurationFactory org.apache.logging.log4j.core.config.ConfigurationFactory$Factory@75f9eccc
TRACE StatusLogger Trying to find [log4j2.properties] using context class loader jdk.internal.loader.ClassLoaders$AppClassLoader@73d16e93.
DEBUG StatusLogger PluginManager 'Lookup' found 16 plugins
DEBUG StatusLogger Apache Log4j Core 2.17.2 initializing configuration org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@2cbb3d47
DEBUG StatusLogger PluginManager 'Core' found 127 plugins
DEBUG StatusLogger PluginManager 'Level' found 0 plugins
DEBUG StatusLogger PluginManager 'Lookup' found 16 plugins
DEBUG StatusLogger Building Plugin[name=AppenderRef, class=org.apache.logging.log4j.core.config.AppenderRef].
TRACE StatusLogger TypeConverterRegistry initializing.
DEBUG StatusLogger PluginManager 'TypeConverter' found 26 plugins
DEBUG StatusLogger createAppenderRef(ref="fileLogger", level="null", Filter=null)
DEBUG StatusLogger Building Plugin[name=logger, class=org.apache.logging.log4j.core.config.LoggerConfig].
DEBUG StatusLogger LoggerConfig$Builder(additivity="null", level="TRACE", levelAndRefs="null", name="ExampleClass", includeLocation="null", ={fileLogger}, ={}, Configuration, Filter=null)
DEBUG StatusLogger Building Plugin[name=loggers, class=org.apache.logging.log4j.core.config.LoggersPlugin].
DEBUG StatusLogger createLoggers(={ExampleClass})
DEBUG StatusLogger Building Plugin[name=layout, class=org.apache.logging.log4j.core.layout.PatternLayout].
DEBUG StatusLogger PatternLayout$Builder(pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n", PatternSelector=null, Configuration, Replace=null, charset="null", alwaysWriteExceptions="null", disableAnsi="null", noConsoleNoAnsi="null", header="null", footer="null")
DEBUG StatusLogger PluginManager 'Converter' found 45 plugins
DEBUG StatusLogger Building Plugin[name=appender, class=org.apache.logging.log4j.core.appender.FileAppender].
DEBUG StatusLogger FileAppender$Builder(fileName="ExampleClass.log", append="null", locking="null", advertise="null", advertiseUri="null", createOnDemand="null", filePermissions="null", fileOwner="null", fileGroup="null", bufferedIo="null", bufferSize="null", immediateFlush="null", ignoreExceptions="null", PatternLayout(%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n), name="fileLogger", Configuration, Filter=null, ={})
DEBUG StatusLogger Starting FileManager ExampleClass.log
DEBUG StatusLogger Building Plugin[name=appenders, class=org.apache.logging.log4j.core.config.AppendersPlugin].
DEBUG StatusLogger createAppenders(={fileLogger})
WARN StatusLogger No Root logger was configured, creating default ERROR-level Root logger with Console appender
DEBUG StatusLogger Starting OutputStreamManager SYSTEM_OUT.false.false-2
DEBUG StatusLogger Configuration org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@2cbb3d47 initialized
DEBUG StatusLogger Starting configuration org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@2cbb3d47
DEBUG StatusLogger Started configuration org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@2cbb3d47 OK.
TRACE StatusLogger Stopping org.apache.logging.log4j.core.config.DefaultConfiguration@10a035a0...
TRACE StatusLogger DefaultConfiguration notified 1 ReliabilityStrategies that config will be stopped.
TRACE StatusLogger DefaultConfiguration stopping root LoggerConfig.
TRACE StatusLogger DefaultConfiguration notifying ReliabilityStrategies that appenders will be stopped.
TRACE StatusLogger DefaultConfiguration stopping remaining Appenders.
DEBUG StatusLogger Shutting down OutputStreamManager SYSTEM_OUT.false.false-1
DEBUG StatusLogger OutputStream closed
DEBUG StatusLogger Shut down OutputStreamManager SYSTEM_OUT.false.false-1, all resources released: true
DEBUG StatusLogger Appender DefaultConsole-1 stopped with status true
TRACE StatusLogger DefaultConfiguration stopped 1 remaining Appenders.
TRACE StatusLogger DefaultConfiguration cleaning Appenders from 1 LoggerConfigs.
DEBUG StatusLogger Stopped org.apache.logging.log4j.core.config.DefaultConfiguration@10a035a0 OK
TRACE StatusLogger Reregistering MBeans after reconfigure. Selector=org.apache.logging.log4j.core.selector.ClassLoaderContextSelector@53aad5d5
TRACE StatusLogger Reregistering context (1/1): '73d16e93' org.apache.logging.log4j.core.LoggerContext@4d826d77
TRACE StatusLogger Unregistering but no MBeans found matching 'org.apache.logging.log4j2:type=73d16e93'
TRACE StatusLogger Unregistering but no MBeans found matching 'org.apache.logging.log4j2:type=73d16e93,component=StatusLogger'
TRACE StatusLogger Unregistering but no MBeans found matching 'org.apache.logging.log4j2:type=73d16e93,component=ContextSelector'
TRACE StatusLogger Unregistering but no MBeans found matching 'org.apache.logging.log4j2:type=73d16e93,component=Loggers,name=*'
TRACE StatusLogger Unregistering but no MBeans found matching 'org.apache.logging.log4j2:type=73d16e93,component=Appenders,name=*'
TRACE StatusLogger Unregistering but no MBeans found matching 'org.apache.logging.log4j2:type=73d16e93,component=AsyncAppenders,name=*'
TRACE StatusLogger Unregistering but no MBeans found matching 'org.apache.logging.log4j2:type=73d16e93,component=AsyncLoggerRingBuffer'
TRACE StatusLogger Unregistering but no MBeans found matching 'org.apache.logging.log4j2:type=73d16e93,component=Loggers,name=*,subtype=RingBuffer'
DEBUG StatusLogger Registering MBean org.apache.logging.log4j2:type=73d16e93
DEBUG StatusLogger Registering MBean org.apache.logging.log4j2:type=73d16e93,component=StatusLogger
DEBUG StatusLogger Registering MBean org.apache.logging.log4j2:type=73d16e93,component=ContextSelector
DEBUG StatusLogger Registering MBean org.apache.logging.log4j2:type=73d16e93,component=Loggers,name=ExampleClass
DEBUG StatusLogger Registering MBean org.apache.logging.log4j2:type=73d16e93,component=Appenders,name=DefaultConsole-2
DEBUG StatusLogger Registering MBean org.apache.logging.log4j2:type=73d16e93,component=Appenders,name=fileLogger
TRACE StatusLogger Using default SystemClock for timestamps.
DEBUG StatusLogger org.apache.logging.log4j.core.util.SystemClock supports precise timestamps.
TRACE StatusLogger Using DummyNanoClock for nanosecond timestamps.
DEBUG StatusLogger Reconfiguration complete for context[name=73d16e93] at URI C:\Users\mbmas_000\workspace\TestCommonsLogging2\bin\log4j2.properties (org.apache.logging.log4j.core.LoggerContext@4d826d77) with optional ClassLoader: null
DEBUG StatusLogger Shutdown hook enabled. Registering a new one.
DEBUG StatusLogger LoggerContext[name=73d16e93, org.apache.logging.log4j.core.LoggerContext@4d826d77] started OK.
11:22:55.347 [main] INFO ExampleClass - info in the main method
11:22:55.352 [main] ERROR ExampleClass - error in the main method
DEBUG StatusLogger Stopping LoggerContext[name=73d16e93, org.apache.logging.log4j.core.LoggerContext@4d826d77]
DEBUG StatusLogger Stopping LoggerContext[name=73d16e93, org.apache.logging.log4j.core.LoggerContext@4d826d77]...
TRACE StatusLogger Unregistering 1 MBeans: [org.apache.logging.log4j2:type=73d16e93]
TRACE StatusLogger Unregistering 1 MBeans: [org.apache.logging.log4j2:type=73d16e93,component=StatusLogger]
TRACE StatusLogger Unregistering 1 MBeans: [org.apache.logging.log4j2:type=73d16e93,component=ContextSelector]
TRACE StatusLogger Unregistering 1 MBeans: [org.apache.logging.log4j2:type=73d16e93,component=Loggers,name=ExampleClass]
TRACE StatusLogger Unregistering 2 MBeans: [org.apache.logging.log4j2:type=73d16e93,component=Appenders,name=fileLogger, org.apache.logging.log4j2:type=73d16e93,component=Appenders,name=DefaultConsole-2]
TRACE StatusLogger Unregistering but no MBeans found matching 'org.apache.logging.log4j2:type=73d16e93,component=AsyncAppenders,name=*'
TRACE StatusLogger Unregistering but no MBeans found matching 'org.apache.logging.log4j2:type=73d16e93,component=AsyncLoggerRingBuffer'
TRACE StatusLogger Unregistering but no MBeans found matching 'org.apache.logging.log4j2:type=73d16e93,component=Loggers,name=*,subtype=RingBuffer'
TRACE StatusLogger Stopping org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@2cbb3d47...
TRACE StatusLogger PropertiesConfiguration notified 2 ReliabilityStrategies that config will be stopped.
TRACE StatusLogger PropertiesConfiguration stopping 1 LoggerConfigs.
TRACE StatusLogger PropertiesConfiguration stopping root LoggerConfig.
TRACE StatusLogger PropertiesConfiguration notifying ReliabilityStrategies that appenders will be stopped.
TRACE StatusLogger PropertiesConfiguration stopping remaining Appenders.
DEBUG StatusLogger Shutting down FileManager ExampleClass.log
DEBUG StatusLogger OutputStream closed
DEBUG StatusLogger Shut down FileManager ExampleClass.log, all resources released: true
DEBUG StatusLogger Appender fileLogger stopped with status true
DEBUG StatusLogger Shutting down OutputStreamManager SYSTEM_OUT.false.false-2
DEBUG StatusLogger OutputStream closed
DEBUG StatusLogger Shut down OutputStreamManager SYSTEM_OUT.false.false-2, all resources released: true
DEBUG StatusLogger Appender DefaultConsole-2 stopped with status true
TRACE StatusLogger PropertiesConfiguration stopped 2 remaining Appenders.
TRACE StatusLogger PropertiesConfiguration cleaning Appenders from 2 LoggerConfigs.
DEBUG StatusLogger Stopped org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@2cbb3d47 OK
DEBUG StatusLogger Stopped LoggerContext[name=73d16e93, org.apache.logging.log4j.core.LoggerContext@4d826d77] with status true
Note the following:
The file ExampleClass.log is created and is in the correct format.
The console log entries created (you can see this in the above output) are:
11:22:55.347 [main] INFO ExampleClass - info in the main method
11:22:55.352 [main] ERROR ExampleClass - error in the main method
are not in the format specified in log4j2.properties
.
The log went to both the console and the file. How do log only to the file logger?
As you can see from this warning message:
WARN StatusLogger No Root logger was configured, creating default ERROR-level Root logger with Console appender
you always need to configure a root logger, otherwise one will be configured for you.
If you want to remove the console appender, you just need to configure a root logger without appender. For this you need to set (any) level on the root logger:
rootLogger.level = OFF
Edit: If on the other hand you just want for the logs of the "ExampleClass` to skip the console appender, you should disable additivity for the logger:
logger.ExampleClass.additivity = false
Remark: You should configure the root logger anyway. The default values are equivalent to:
appender.c.type = Console
appender.c.name = Console
appender.c.l.type = PatternLayout
appender.c.l.pattern = %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
rootLogger.level = ERROR
rootLogger.appenderRef.0.ref = Console