Logging with Log4j in Selenium Java - Build an Automation Script
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.time.Duration; public class LoginTest { private WebDriver driver; private WebDriverWait wait; private static final Logger logger = LogManager.getLogger(LoginTest.class); @BeforeClass public void setUp() { // Setup ChromeDriver path if needed driver = new ChromeDriver(); wait = new WebDriverWait(driver, Duration.ofSeconds(10)); logger.info("Browser launched"); } @Test public void testLoginWithLogging() { driver.get("https://example.com/login"); logger.info("Navigated to login page"); driver.findElement(By.id("email")).sendKeys("admin@test.com"); logger.debug("Entered email address"); driver.findElement(By.id("password")).sendKeys("Pass123!"); logger.debug("Entered password"); driver.findElement(By.id("loginBtn")).click(); logger.info("Clicked login button"); // Wait until URL changes to dashboard wait.until(ExpectedConditions.urlToBe("https://example.com/dashboard")); logger.info("Login successful, dashboard loaded"); Assert.assertEquals(driver.getCurrentUrl(), "https://example.com/dashboard", "Dashboard URL should be loaded after login"); } @AfterClass public void tearDown() { if (driver != null) { driver.quit(); logger.info("Browser closed"); } } }
This test class uses Selenium WebDriver with TestNG and Log4j2 for logging.
1. Logger setup: We create a static logger instance using LogManager.getLogger for this class.
2. Setup method: Launches Chrome browser and initializes explicit wait. Logs info message.
3. Test method: Navigates to login page and logs info. Enters email and password with debug logs after each input. Clicks login button and logs info. Waits explicitly for the dashboard URL to load and logs success info. Asserts the URL is correct.
4. Teardown method: Closes browser and logs info.
Explicit waits avoid flaky tests. Using By.id locators keeps selectors stable. Logging at info and debug levels helps track test flow and data entry.
Now add data-driven testing with 3 different sets of login credentials (valid and invalid) using TestNG data provider.
Practice
Solution
Step 1: Understand Log4j's role
Log4j is a logging tool used to record messages during program execution.Step 2: Relate to Selenium tests
In Selenium tests, logging helps track what happens and find issues.Final Answer:
To record messages about test execution for debugging and analysis -> Option CQuick Check:
Logging = record messages [OK]
- Thinking Log4j speeds up tests
- Confusing logging with UI creation
- Assuming Log4j manages databases
Solution
Step 1: Recall Log4j Logger creation syntax
Log4j uses Logger.getLogger(String name) to create or get a logger.Step 2: Check options
Only Logger logger = Logger.getLogger("MyLogger"); uses the correct method Logger.getLogger("MyLogger").Final Answer:
Logger logger = Logger.getLogger("MyLogger"); -> Option AQuick Check:
Use getLogger() to create Logger [OK]
- Trying to instantiate Logger with new
- Using non-existent methods like createLogger or initLogger
- Missing the logger name string
Logger logger = Logger.getLogger("TestLogger");
logger.info("Info message");
logger.warn("Warning message");
logger.error("Error message");Solution
Step 1: Understand log level filtering
Log4j outputs messages at or above the set level. WARN level shows WARN and ERROR but not INFO.Step 2: Apply to given messages
INFO is below WARN, so skipped. WARN and ERROR messages are shown.Final Answer:
Warning message, Error message -> Option BQuick Check:
Log level WARN shows WARN and ERROR [OK]
- Assuming all messages print regardless of level
- Thinking INFO is shown at WARN level
- Confusing ERROR with higher or lower level
Logger logger = Logger.getLogger("MyTestLogger");
logger.debug("Debug message");
What is the most likely reason?Solution
Step 1: Check logger creation
The logger creation syntax is correct, so this is not the issue.Step 2: Understand log level filtering
If the log level is set above DEBUG (like INFO or WARN), debug messages won't show.Final Answer:
The log level is set higher than DEBUG, so debug messages are ignored -> Option AQuick Check:
Higher log level hides lower level messages [OK]
- Thinking logger needs start() method
- Assuming DEBUG is unsupported
- Believing logger creation failed silently
Solution
Step 1: Understand Log4j appenders
Appenders send log messages to different outputs like console or files.Step 2: Use multiple appenders with thresholds
You can configure one appender for console with ERROR level, and another for file with INFO or WARN level.Step 3: Configure in log4j.properties
This setup is done in the configuration file, not by manual code filtering.Final Answer:
Use two appenders with different thresholds and configure them in log4j.properties -> Option DQuick Check:
Multiple appenders + thresholds = selective logging [OK]
- Trying to filter messages manually in code
- Setting global level only without appenders
- Thinking Log4j can't split outputs by level
Ready to prove it?
Pass the test and this pattern moves unknown
