I am bit confused why my log4j2 logging levels and appenders dont seem to work as I expect. Let me give the details.
Project Structure:
Main.java :
<code>package com.my.sample.MySampleProject;
import org.apache.logging.log4j.Logger;
import com.my.sample.package2.MyPackage2Class;
import org.apache.logging.log4j.LogManager;
private static Logger logger = LogManager.getLogger(Main.class);
public static void main(String[] args) {
logger.debug("Debug log message");
logger.info("Info log message");
logger.error("Error log message");
MyPackage2Class classPack2 = new MyPackage2Class();
classPack2.printStatement();
<code>package com.my.sample.MySampleProject;
import org.apache.logging.log4j.Logger;
import com.my.sample.package2.MyPackage2Class;
import org.apache.logging.log4j.LogManager;
public class Main {
private static Logger logger = LogManager.getLogger(Main.class);
public static void main(String[] args) {
logger.debug("Debug log message");
logger.info("Info log message");
logger.error("Error log message");
MyPackage2Class classPack2 = new MyPackage2Class();
classPack2.printStatement();
}
}
</code>
package com.my.sample.MySampleProject;
import org.apache.logging.log4j.Logger;
import com.my.sample.package2.MyPackage2Class;
import org.apache.logging.log4j.LogManager;
public class Main {
private static Logger logger = LogManager.getLogger(Main.class);
public static void main(String[] args) {
logger.debug("Debug log message");
logger.info("Info log message");
logger.error("Error log message");
MyPackage2Class classPack2 = new MyPackage2Class();
classPack2.printStatement();
}
}
MyPackage2Class.java
<code>package com.my.sample.package2;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MyPackage2Class {
private static Logger logger = LogManager.getLogger("MyLoggerPackage2");
public void printStatement() {
logger.debug("Package2 Debug log message");
logger.info("Package2 Info log message");
logger.error("Package2 Error log message");
<code>package com.my.sample.package2;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MyPackage2Class {
private static Logger logger = LogManager.getLogger("MyLoggerPackage2");
public void printStatement() {
logger.debug("Package2 Debug log message");
logger.info("Package2 Info log message");
logger.error("Package2 Error log message");
}
}
</code>
package com.my.sample.package2;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MyPackage2Class {
private static Logger logger = LogManager.getLogger("MyLoggerPackage2");
public void printStatement() {
logger.debug("Package2 Debug log message");
logger.info("Package2 Info log message");
logger.error("Package2 Error log message");
}
}
log4j2.properties
# Direct log messages to STDOUT
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
appender.file.type = File
appender.file.name = LOGFILE
appender.file.fileName = sample/logs/log4j2.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
log4j.logger.MyLoggerPackage2=ERROR, STDOUT
log4j.additivity.MyLoggerPackage2=false
rootLogger=INFO, STDOUT, LOGFILE
<code>
# Direct log messages to STDOUT
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
# Direct to a file
appender.file.type = File
appender.file.name = LOGFILE
appender.file.fileName = sample/logs/log4j2.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
log4j.logger.MyLoggerPackage2=ERROR, STDOUT
log4j.additivity.MyLoggerPackage2=false
# Root Logger
rootLogger=INFO, STDOUT, LOGFILE
</code>
# Direct log messages to STDOUT
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
# Direct to a file
appender.file.type = File
appender.file.name = LOGFILE
appender.file.fileName = sample/logs/log4j2.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
log4j.logger.MyLoggerPackage2=ERROR, STDOUT
log4j.additivity.MyLoggerPackage2=false
# Root Logger
rootLogger=INFO, STDOUT, LOGFILE
So basically root logger set to INFO level with appender STDOUT, LOGFILE
MyLoggerPackage2 logger set to ERROR level with appender STDOUT with additivity false
So I should expect only ERROR level logs for MyPackage2Class in console only.
But in console I see:
<code>[INFO ] 2024-06-19 11:19:12.769 [main] Main - Info log message
[ERROR] 2024-06-19 11:19:12.772 [main] Main - Error log message
[INFO ] 2024-06-19 11:19:12.779 [main] MyLoggerPackage2 - Package2 Info log message
[ERROR] 2024-06-19 11:19:12.779 [main] MyLoggerPackage2 - Package2 Error log message
<code>[INFO ] 2024-06-19 11:19:12.769 [main] Main - Info log message
[ERROR] 2024-06-19 11:19:12.772 [main] Main - Error log message
[INFO ] 2024-06-19 11:19:12.779 [main] MyLoggerPackage2 - Package2 Info log message
[ERROR] 2024-06-19 11:19:12.779 [main] MyLoggerPackage2 - Package2 Error log message
</code>
[INFO ] 2024-06-19 11:19:12.769 [main] Main - Info log message
[ERROR] 2024-06-19 11:19:12.772 [main] Main - Error log message
[INFO ] 2024-06-19 11:19:12.779 [main] MyLoggerPackage2 - Package2 Info log message
[ERROR] 2024-06-19 11:19:12.779 [main] MyLoggerPackage2 - Package2 Error log message
In the logfile I see:
<code>[INFO ] 2024-06-19 11:19:12.769 [main] Main - Info log message
[ERROR] 2024-06-19 11:19:12.772 [main] Main - Error log message
[INFO ] 2024-06-19 11:19:12.779 [main] MyLoggerPackage2 - Package2 Info log message
[ERROR] 2024-06-19 11:19:12.779 [main] MyLoggerPackage2 - Package2 Error log message
<code>[INFO ] 2024-06-19 11:19:12.769 [main] Main - Info log message
[ERROR] 2024-06-19 11:19:12.772 [main] Main - Error log message
[INFO ] 2024-06-19 11:19:12.779 [main] MyLoggerPackage2 - Package2 Info log message
[ERROR] 2024-06-19 11:19:12.779 [main] MyLoggerPackage2 - Package2 Error log message
</code>
[INFO ] 2024-06-19 11:19:12.769 [main] Main - Info log message
[ERROR] 2024-06-19 11:19:12.772 [main] Main - Error log message
[INFO ] 2024-06-19 11:19:12.779 [main] MyLoggerPackage2 - Package2 Info log message
[ERROR] 2024-06-19 11:19:12.779 [main] MyLoggerPackage2 - Package2 Error log message
What mistake am I doing? A little explanation would be helpful.
I tried changing position of the rootLogger settings to the bottom, changing the root logger level (which is taking effect)
Thanks in advance.