Log hay nhật ký hoạt động là một trong những thông tin quan trọng để chúng ta có thể xem xét lại khi có vấn đề gì đó xảy ra, tuy nhiên cũng cần phải hạn chế việc ghi log để làm tiêu tốn quá nhiều dung lượng ổ cứng. Cũng giống như các tính năng common khác, EzyPlatform cũng quản lý tính năng log này để có thể hoạt động một cách hiệu quả.

Ghi riêng log của từng thành phần

EzyPlatform không ghi toàn bộ log vào một tập tin duy nhất mà tách ra thành từng tập tin riêng tương ứng với admin, web và socket:

EzyPlatform quản lý log thế nào.png

Điều này để tránh bị xung đột giữa các luồng ghi tập tin log, giúp thông tin được ghi chính xác, tập tin log cũng nhỏ hơn và một phần nào đó cũng giúp cho tốc độ ghi log nhanh hơn.

Mỗi một thành phần lại sử dụng riêng tập tin logback.xml của mình để có khả năng cấu hình khác nhau khi cần thiết.

Cấu hình tập tin logback.xml

EzyPlatform sử dụng logback, chính vì vậy mà tập tin cấu hình có tên là logback.xml. Ví dụ cấu hình của admin sẽ như sau:

<configuration>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} %msg%n
            </pattern>
        </encoder>
    </appender>

    <appender name="fileRolling" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/admin-server.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/admin-server.log.%d{yyyy-MM-dd}</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} %msg%n
            </pattern>
        </encoder>
    </appender>

    <appender name="file" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="fileRolling" />
    </appender>

    <appender name="composite" class="org.youngmonkeys.ezyplatform.logback.CompositeLogbackAppender" />

    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
        <appender-ref ref="composite"/>
    </root>
</configuration>

Ở đây chúng ta có:

  1. Định dạng của một dòng log sẽ là: %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} %msg%n.
  2. Log ban đầu sẽ được lưu ở một tập tin logs/admin-server.log, tuy nhiên sau 1 ngày thì sẽ được tạo thành tập tin mới tương ứng với ngày đó.
  3. Level log mặc định là info, nghĩa là những log từ debug trở lại sẽ không được ghi.
  4. Log không được xoá định kỳ, nếu bạn muốn định kỳ xoá log bạn có thể cài đặt Log Monitor plugin.

Lớp CompositeLogbackAppender

Như bạn có thể thấy trong tập tin logback.xml, đây là một lớp được phát triển bởi EzyPlatform, không phải mặc định của sẵn của logback, mã nguồn của nó chỉ đơn giản thế này:

public class CompositeLogbackAppender extends LogbackAppender {

    @Override
    protected void append(ILoggingEvent event) {
        LogbackAppenderManager
            .getInstance()
            .forEach(it -> it.doAppend(event));
    }
}

Nó sẽ gọi đến các lớp Appender được cài đặt bởi cả EzyPlatform lẫn các plugin để cho phép can thiệp vào quá trình log, ví dụ để gửi log WARN, ERROR vào hệ thống giám sát chẳng hạn.

Tổng kết lại

EzyPlatform quản lý log tương đối đơn giản nhưng đủ để các nhà phát triển yên tâm sử dụng. EzyPlatform cũng không quá ôm đồm nhiều việc để quản lý log quá chi tiết, thay vào đó thông qua lớp CompositeLogbackAppender nó sẽ cho phép các plugin bổ sung thêm các tính năng quản lý log nâng cao hơn.