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
Chú ý là vấn đề bảo mật ở bản cũ có lỗi bị Hack nên là phải dùng bản 2.17.0 trở về sau nhé. (updated 18/12/2021)
Cập nhật mới nhất 2.20.0 (updated 21/02/2023)
1.1. Maven
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</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.20.0</version>
</dependency>
1.2. Gradle
dependencies {
implementation 'org.apache.logging.log4j:log4j-api:2.20.0'
implementation 'org.apache.logging.log4j:log4j-core:2.20.0'
}
2. Tạo file bắt buộc tên 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=logs/app-properties.log
appenders=file
appender.file.type=File
appender.file.name=LOGFILE
appender.file.fileName=${filename}
appender.file.filePattern=logs/applog-%d{dd-MM-yyyy}.log
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=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.filePattern=logs/applog-%d{dd-MM-yyyy}.log
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 ] 13-12-2021 04:09:02 [main] Log - loginPage
Còn chổ định dạng tên file thì property.filename=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ẵn hạn.
3. Tạo file với tên 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="LogToConsole" 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="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="LogToConsole" 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="logs/app-xml.log">
<PatternLayout pattern="[%-5level] %d{dd-MM-yyyy HH:mm:ss} [%t] %c{1} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Logger name="anhtester.com" 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 Log (tên gì cũng được) và viết đoạn code như bên dưới:
package anhtester.com.common.ultilities;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log {
//Initialize Log4j instance
private static final Logger Log = LogManager.getLogger(Log.class);
//Info Level Logs
public static void info (String message) {
Log.info(message);
}
public static void info (Object object) {
Log.info(object);
}
//Warn Level Logs
public static void warn (String message) {
Log.warn(message);
}
public static void warn (Object object) {
Log.warn(object);
}
//Error Level Logs
public static void error (String message) {
Log.error(message);
}
public static void error (Object object) {
Log.error(object);
}
//Fatal Level Logs
public static void fatal (String message) {
Log.fatal(message);
}
//Debug Level Logs
public static void debug (String message) {
Log.debug(message);
}
public static void debug (Object object) {
Log.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 gọi Log ra dùng
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 =))
Log.info("ghi cái gì đó ra đây");
Cái trên là dành cho biết THÔNG TIN
Ngoài ra thì còn có 4 cái loại còn lại của class Log trên setup á. Loại thông tin là gì thì dùng dạng cho phù hợp. VD lỗi thì dùng Log.error
Log.debug("This is a debug message");
Log.warn("This is a warn message");
Log.error("This is an error message");
Log.fatal("This is a fatal message");
🔆 Kết quả Log sẽ được ghi lại sau khi chạy test case
(bên dưới là An dùng cả 2 dạng ghi log vào Console và File)
![[Selenium Java] Bài 30: Sử dụng Log4j để ghi Log vào file trong Selenium Java | Anh Tester](/uploads/lesson/selenium_java/log4j2/ket_qua_log-min.jpg)
✳️ Các vị trí cần ghi log
- WebUI keyword
- TestListener
- Các phương thức load trước khi chạy test như: PropertiesHelper, ExcelHelper,...