Skip to main content

Command Palette

Search for a command to run...

Bài 17: Spring Boot và Logging

Published
5 min readView as Markdown

1. Giới thiệu về Logging

Logging là một phần quan trọng trong phát triển phần mềm, giúp theo dõi và ghi lại các sự kiện xảy ra trong ứng dụng. Logging cung cấp thông tin chi tiết về hành vi của ứng dụng, giúp phát hiện và khắc phục sự cố một cách hiệu quả. Spring Boot hỗ trợ tích hợp logging mạnh mẽ với các framework phổ biến như Logback, Log4j2, và Java Util Logging (JUL).

2. Cấu hình Logging trong Spring Boot

Mặc định, Spring Boot sử dụng Logback làm framework logging chính. Bạn có thể dễ dàng thay đổi cấu hình logging hoặc chuyển sang sử dụng các framework khác như Log4j2.

2.1. Cấu hình Logback

Logback là framework logging mặc định trong Spring Boot. Bạn có thể cấu hình Logback bằng cách tạo file logback-spring.xml hoặc logback.xml trong thư mục src/main/resources.

Ví dụ cấu hình Logback (logback-spring.xml):

<configuration>
    <!-- Console Appender -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- File Appender -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/spring-boot-app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/spring-boot-app.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- Root Logger -->
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>

    <!-- Logger for specific package -->
    <logger name="com.example.myapp" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </logger>
</configuration>

2.2. Cấu hình Log4j2

Nếu bạn muốn sử dụng Log4j2 thay vì Logback, bạn cần thêm dependency spring-boot-starter-log4j2 và loại bỏ dependency spring-boot-starter-logging.

Ví dụ với Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<exclusions>
    <exclusion>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </exclusion>
</exclusions>

Ví dụ với Gradle:

implementation 'org.springframework.boot:spring-boot-starter-log4j2'
configurations {
    all {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
}

Sau đó, tạo file cấu hình log4j2-spring.xml trong thư mục src/main/resources.

Ví dụ cấu hình Log4j2 (log4j2-spring.xml):

<Configuration status="WARN">
    <Appenders>
        <!-- Console Appender -->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %msg%n" />
        </Console>

        <!-- File Appender -->
        <RollingFile name="File" fileName="logs/spring-boot-app.log"
                     filePattern="logs/spring-boot-app-%d{yyyy-MM-dd}.log.gz">
            <PatternLayout>
                <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy />
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>
        <!-- Root Logger -->
        <Root level="info">
            <AppenderRef ref="Console" />
            <AppenderRef ref="File" />
        </Root>

        <!-- Logger for specific package -->
        <Logger name="com.example.myapp" level="debug" additivity="false">
            <AppenderRef ref="Console" />
            <AppenderRef ref="File" />
        </Logger>
    </Loggers>
</Configuration>

3. Sử dụng các framework logging

3.1. Logback

Logback là framework logging mặc định trong Spring Boot. Bạn có thể sử dụng các lớp và phương thức của Logback để ghi lại nhật ký trong ứng dụng của mình.

Ví dụ:

package com.example.myapp;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {
    private static final Logger logger = LoggerFactory.getLogger(MyComponent.class);

    public void doSomething() {
        logger.info("This is an info message");
        logger.debug("This is a debug message");
        logger.error("This is an error message");
    }
}

3.2. Log4j2

Nếu bạn sử dụng Log4j2, bạn có thể sử dụng các lớp và phương thức của Log4j2 để ghi lại nhật ký trong ứng dụng của mình.

Ví dụ:

package com.example.myapp;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {
    private static final Logger logger = LogManager.getLogger(MyComponent.class);

    public void doSomething() {
        logger.info("This is an info message");
        logger.debug("This is a debug message");
        logger.error("This is an error message");
    }
}

4. Tùy chỉnh logging cho từng môi trường

Spring Boot cho phép bạn cấu hình logging riêng biệt cho từng môi trường (development, production, etc.) bằng cách sử dụng các file cấu hình khác nhau hoặc sử dụng profile-specific properties.

Ví dụ cấu hình logging cho môi trường development và production trong application.properties:

# application-dev.properties
logging.level.com.example.myapp=DEBUG
logging.file.name=logs/spring-boot-app-dev.log

# application-prod.properties
logging.level.com.example.myapp=INFO
logging.file.name=logs/spring-boot-app-prod.log

Bạn có thể kích hoạt profile tương ứng khi chạy ứng dụng bằng cách sử dụng thuộc tính spring.profiles.active.

Ví dụ:

java -jar myapp.jar --spring.profiles.active=prod

5. Ví dụ chi tiết

Dưới đây là một ví dụ chi tiết từ đầu đến cuối về cấu hình logging trong ứng dụng Spring Boot.

5.1. Tạo dự án Spring Boot

Sử dụng Spring Initializr để tạo dự án với các dependency sau:

  • Spring Web

  • Spring Boot Starter Logging (mặc định)

5.2. Cấu trúc dự án

myapp
|-- src
|   |-- main
|   |   |-- java
|   |   |   `-- com
|   |   |       `-- example
|   |   |           `-- myapp
|   |   |               |-- MySpringBootApplication.java
|   |   |               `-- MyComponent.java
|   |   `-- resources
|   |       `-- logback-spring.xml
|-- pom.xml

5.3. Cấu hình Logback

Tạo file logback-spring.xml trong thư mục src/main/resources.

logback-spring.xml:

<configuration>
    <!-- Console Appender -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- File Appender -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/spring-boot-app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/spring-boot-app.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- Root Logger -->
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>

    <!-- Logger for specific package -->
    <logger name="com.example.myapp" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </logger>
</configuration>

5.4. Tạo lớp chính

của ứng dụng

// MySpringBootApplication.java
package com.example.myapp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MySpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}

5.5. Tạo component để ghi nhật ký

// MyComponent.java
package com.example.myapp;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class MyComponent {
    private static final Logger logger = LoggerFactory.getLogger(MyComponent.class);

    @PostConstruct
    public void init() {
        logger.info("This is an info message");
        logger.debug("This is a debug message");
        logger.error("This is an error message");
    }
}

5.6. Chạy ứng dụng

Chạy ứng dụng bằng cách sử dụng Maven:

mvn spring-boot:run

Kiểm tra console và file logs/spring-boot-app.log để xem các thông báo nhật ký.

6. Kết luận

Trong bài viết này, chúng ta đã tìm hiểu về cách cấu hình logging trong Spring Boot, sử dụng Logback và Log4j2 để ghi lại nhật ký của ứng dụng. Chúng ta cũng đã thấy cách tùy chỉnh cấu hình logging cho từng môi trường khác nhau và cách sử dụng các framework logging để ghi lại các sự kiện quan trọng trong ứng dụng.

Trong bài viết tiếp theo, chúng ta sẽ tìm hiểu về cách tích hợp Spring Boot với Docker để tạo các container cho ứng dụng của bạn, giúp việc triển khai và quản lý ứng dụng trở nên dễ dàng hơn.

More from this blog

devngu

169 posts