Giới thiệu
1.1 Giới thiệu về nhật ký (log)
Nhật ký được sử dụng để ghi lại các sự kiện xảy ra trong hệ thống. Các vị trí lưu trữ nhật ký phổ biến bao gồm: console, tệp trên đĩa, v.v.
1.2 Cấp độ nhật ký
Các cấp độ nhật ký từ thấp đến cao: - TRACE, DEBUG, INFO, WARN, ERROR, FATAL
1.3 Tác dụng của nhật ký
- Quan sát và phân tích tình trạng hoạt động của dự án (dự án bảo trì).
- Phân tích cách người dùng sử dụng thông qua nhật ký (phân tích dữ liệu lớn).
Giải pháp 1: Sử dụng Log4j và Commons-Logging
2.1.1 Thêm phụ thuộc
Thêm phụ thuộc Log4j và Commons-Logging vào dự án:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
2.1.2 Sử dụng cơ bản
Ví dụ về API cơ bản của Log4j và Commons-Logging:
package com.example.logging;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
public class LogTest {
private Log log = LogFactory.getLog(LogTest.class);
@Test
public void test() {
log.trace("hello trace");
log.debug("hello debug");
log.info("hello info");
log.warn("hello warn");
log.error("hello error");
log.fatal("hello fatal");
}
}
2.1.3 Cấu hình
Tạo tệp cấu hình log4j.xml:
<appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>
</layout>
</appender>
<appender name="myFile1" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="d:/log/hello1.log"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="1kb"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>
</layout>
</appender>
<appender name="myFile2" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="d:/log/daily.log"/>
<param name="Append" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>
</layout>
</appender>
<root>
<priority value="debug"/>
</root>
Giải pháp 2: Sử dụng Logback và SLF4j
3.1.1 Thêm phụ thuộc
Thêm phụ thuộc Logback và SLF4j vào dự án:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>test</scope>
</dependency>
3.1.2 Sử dụng cơ bản
Ví dụ về API cơ bản của Logback và SLF4j:
package com.example.logging;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogTest {
private Logger log = LoggerFactory.getLogger(LogTest.class);
@Test
public void test() throws InterruptedException {
log.trace("hello trace");
log.debug("hello debug Nguyễn Văn A");
log.info("hello info Nguyễn Văn A");
log.warn("hello warn Nguyễn Văn A");
log.error("hello error Nguyễn Văn A");
}
}
3.1.3 Cấu hình
Tạo tệp cấu hình logback.xml:
<configuration scan="true" scanPeriod="60 seconds" debug="true">
<property name="log.path" value="d:/log"/>
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} |-{%-5p} in %logger.%M[line-%L] -%m%n"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="file1" class="ch.qos.logback.core.FileAppender">
<file>${log.path}/hello.log</file>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
</encoder>
</appender>
<appender name="file2" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/logback.log</file>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/logback-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1kb</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>1</maxHistory>
</rollingPolicy>
</appender>
<root level="trace">
</root>
</configuration>