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
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.22.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'
}
Chú ý là vấn đề bảo mật ở bảo 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)
2. Tạo file 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=[%-5level] %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=[%-5level] %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=[%-5level] %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=[%-5level] %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 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="anhtester.com" 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="anhtester.com" 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");
Anh Tester
facebook.com/anhtester
Đường dẫu khó chân vẫn cần bước đi
Đời dẫu khổ tâm vẫn cần nghĩ thấu