Search code examples
javalog4j2apache-commons-logging

Very simple application of Log4j2 logging to file and console, where console logging is unwanted


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:

  1. The file ExampleClass.log is created and is in the correct format.

  2. 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.

  3. The log went to both the console and the file. How do log only to the file logger?


Solution

  • 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