NỘI DUNG BÀI HỌC
1. Tải thư viện Log4j2
Link tải: Log4j2
- Core: https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core
- API: https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api
Cập nhật mới nhất version 2x là 2.24.3 (updated 13/12/2024)
🔆 Maven
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.24.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.24.3</version>
</dependency>
🔆 Gradle
dependencies {
implementation 'org.apache.logging.log4j:log4j-api:2.24.3'
implementation 'org.apache.logging.log4j:log4j-core:2.24.3'
}
2. Tạo file với tên bắt buộc log4j2.properties để config
2.1. Config để ghi log cho Console Log
name=PropertiesConfigLog4j2
appenders=console
appender.console.type=Console
appender.console.name=STDOUT
appender.console.layout.type=PatternLayout
appender.console.layout.pattern=[%level] %d{dd-MM-yyyy HH:mm:ss} [%t] %c{1} - %msg%n
rootLogger.level=info
rootLogger.appenderRefs=stdout
rootLogger.appenderRef.stdout.ref=STDOUT
2.2. Config để ghi log cho File Log
name=PropertiesConfigLog4j2
property.filename=exports/logs/app-properties.log
appenders=file
appender.file.type=File
appender.file.name=LOGFILE
appender.file.fileName=${filename}
appender.file.layout.type=PatternLayout
appender.file.layout.pattern=[%level] %d{dd-MM-yyyy HH:mm:ss} [%t] %c{1} - %msg%n
loggers=file
logger.file.name=anhtester.com
logger.file.level=debug
logger.file.appenderRefs=file
logger.file.appenderRef.file.ref=LOGFILE
rootLogger.level=info
rootLogger.appenderRefs=file
rootLogger.appenderRef.file.ref=LOGFILE
2.3. Config để ghi log cho cả Console Log và File Log
name=PropertiesConfigLog4j2
property.filename=exports/logs/app-properties.log
appenders=console, file
appender.console.type=Console
appender.console.name=STDOUT
appender.console.layout.type=PatternLayout
appender.console.layout.pattern=[%level] %d{dd-MM-yyyy HH:mm:ss} [%t] %c{1} - %msg%n
appender.file.type=File
appender.file.name=LOGFILE
appender.file.fileName=${filename}
appender.file.layout.type=PatternLayout
appender.file.layout.pattern=[%level] %d{dd-MM-yyyy HH:mm:ss} [%t] %c{1} - %msg%n
loggers=file
logger.file.name=LOGFILE
logger.file.level=info
logger.file.appenderRefs=file
logger.file.appenderRef.file.ref=LOGFILE
rootLogger.level=info
rootLogger.appenderRefs=stdout, file
rootLogger.appenderRef.stdout.ref=STDOUT
rootLogger.appenderRef.file.ref=LOGFILE
Cái chổ mà định dạng ngày giờ nè:layout.pattern=[%-5level] %d{dd-MM-yyyy HH:mm:ss} [%t] %c{1} - %msg%n
VD khi nó sinh ra Log thì như này:
[INFO ] 15-01-2025 20:09:02 [main] LogUtils - Click on element //button[normalize-space()='Login']
Còn chỗ định dạng tên file và đường dẫn xuất ra thì property.filename=exports/logs/app-properties.log
Chú ý là nó tính cả thư mục và tên file chấm phần mở rộng luôn. Các bạn có thể đổi phần mở rộng sang txt chẳng hạn.
3. Tạo file với tên bắt buộc log4j2.xml để config
3.1. Config để ghi log cho Console Log
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Appenders>
<Console name="LogToConsole" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{dd-MM-yyyy HH:mm:ss} [%t] %c{1} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<!-- tránh các bản ghi bị trùng lặp thì set additivity=false -->
<Logger name="Log4j2" level="debug" additivity="false">
<AppenderRef ref="LogToConsole"/>
</Logger>
<Root level="info">
<AppenderRef ref="LogToConsole"/>
</Root>
</Loggers>
</Configuration>
3.2. Config để ghi log cho File Log
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Appenders>
<File name="LogToFile" fileName="exports/logs/app-xml.log">
<PatternLayout pattern="[%-5level] %d{dd-MM-yyyy HH:mm:ss} [%t] %c{1} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<!-- tránh các bản ghi trùng lặp thì set additivity=false -->
<Logger name="Log4j2" level="debug" additivity="false">
<AppenderRef ref="LogToFile"/>
</Logger>
<Root level="info">
<AppenderRef ref="LogToFile"/>
</Root>
</Loggers>
</Configuration>
3.3. Config để ghi log cho cả Console Log và File Log
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Appenders>
<Console name="LogToConsole" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{dd-MM-yyyy HH:mm:ss} [%t] %c{1} - %msg%n"/>
</Console>
<File name="LogToFile" fileName="exports/logs/app-xml.log">
<PatternLayout pattern="[%-5level] %d{dd-MM-yyyy HH:mm:ss} [%t] %c{1} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Logger name="Log4j2" level="debug" additivity="false">
<AppenderRef ref="LogToFile"/>
<AppenderRef ref="LogToConsole"/>
</Logger>
<Root level="info">
<AppenderRef ref="LogToFile"/>
<AppenderRef ref="LogToConsole"/>
</Root>
</Loggers>
</Configuration>
Chú ý: sử dụng Properties hoặc Xml cái nào 1 cái thôi nhé. Cái còn lại đặt tên khác chữ "log4j2" là được.
4. Tạo class setup Logger để gọi lại
Các bạn tạo class tên LogUtils (tên gì cũng được) và viết đoạn code như bên dưới:
package com.anhtester.utils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class LogUtils {
//Initialize Log4j instance
private static final Logger logger = LogManager.getLogger(LogUtils.class);
//Info Level Logs
public static void info(String message) {
logger.info(message);
}
public static void info(Object object) {
logger.info(object);
}
//Warn Level Logs
public static void warn(String message) {
logger.warn(message);
}
public static void warn(Object object) {
logger.warn(object);
}
//Error Level Logs
public static void error(String message) {
logger.error(message);
}
public static void error(Object object) {
logger.error(object);
}
//Fatal Level Logs
public static void fatal(String message) {
logger.fatal(message);
}
//Debug Level Logs
public static void debug(String message) {
logger.debug(message);
}
public static void debug(Object object) {
logger.debug(object);
}
}
Các hàm để static nên khi xíu gọi lại dùng bên test case thì chỉ cần lấy tên Class chấm cái tên Method là được rồi.
5. Tạo test case và ghi logs vào file
Các bạn tạo class test nào đó. Ví dụ thì An lấy class có sẵn cho nhanh.
Để ghi log thì các bạn gọi đúng 1 dòng nhưu sau:
LogUtils.info("ghi cái gì đó ra đây");
Cái trên là dành cho loại THÔNG TIN bình thường.
Ngoài ra thì còn có 4 cái loại còn lại của class LogUtils bên trên setup á. Loại thông tin là gì thì dùng dạng cho phù hợp. VD nếu ghi lỗi thì dùng LogUtils.error, thông tin bình thường thì dùng LogUtils.info
LogUtils.debug("This is a debug message");
LogUtils.warn("This is a warn message");
LogUtils.error("This is an error message");
LogUtils.fatal("This is a fatal message");
🔆 Kết quả logs sẽ được ghi lại sau khi chạy test case
(bên dưới là An dùng cả 2 dạng ghi logs vào Console và File)
✳️ Các vị trí cần ghi log
- WebUI keyword
- TestListener
- Các class Helper: PropertiesHelper, ExcelHelper,...
- Những chỗ khác cần ghi log cho chi tiết hơn.