Chuyển tới nội dung chính

Nhật ký nghiệp vụ & trace

Ghi log nghiệp vụ và audit cho service: annotation @SysLog để ghi bản ghi audit vào bảng sys_log, @Trace để lan truyền trace id qua request, kèm aspect ghi log request/response controller và API publish audit thủ công. Dùng khi cần truy vết "ai đã làm gì, vào lúc nào, trên đối tượng nào".

Khi nào sử dụng

  • Cần audit thao tác nghiệp vụ (actor, target, thời gian, kết quả) phục vụ tra cứu về sau.
  • Cần trace request xuyên service bằng trace id thống nhất trong MDC.
  • Cần ghi log tự động toàn bộ request vào controller mà không sửa code từng endpoint.
  • Cần lưu lịch sử thao tác của một số luồng đặc biệt bằng publish thủ công.

Cài đặt

Thêm dependency vào pom.xml (không cần khai version vì đã được quản lý qua BOM):

<dependency>
<groupId>vn.govex.cloud</groupId>
<artifactId>govex-cloud-log</artifactId>
</dependency>

Version do BOM vn.govex.cloud:dependencies quản lý — xem Cài đặt.

Cấu hình

PropertyMô tảMặc định
govex.log.enabledBật aspect ghi log (@SysLog, log request/response controller). Khi tắt, annotation không có tác dụng.false
govex.log.save-logLưu bản ghi audit vào database (bảng sys_log) qua sự kiện bất đồng bộ.false
govex.trace.enabledBật TracingFilterTraceAspect. Điều kiện auto-config dùng matchIfMissing nên tracing bật mặc định; đặt false để tắt.bật
govex.app-codeMã ứng dụng gắn vào bản ghi audit.

Mức log và dữ liệu ghi nhận chi tiết cấu hình trực tiếp trên annotation @SysLog: logLevel (mặc định DEBUG), showArgs (mặc định false), showResponse (mặc định true), typecontent.

Sử dụng

Bước 1 — bật ghi log/audit và tracing:

govex:
app-code: customer-service
log:
enabled: true
save-log: true
trace:
enabled: true

Bước 2 — ghi audit theo EventType chuẩn (nội dung hỗ trợ SpEL). Target của bản ghi do code nghiệp vụ cung cấp qua SysLogContext:

@SysLog(type = EventType.UPDATE_USER, content = "Cập nhật người dùng #id")
public void updateUser(String id, UserUpdateParam param) {
SysLogContext.setTargetList(List.of(
Target.builder().type(TargetType.USER).id(id).build()));
try {
// ...
} finally {
SysLogContext.clear();
}
}

Bước 3 — publish audit thủ công khi không dùng annotation (ví dụ sự kiện đăng nhập):

sysLogPublisher.publish(EventType.LOGIN_CONSOLE, "Đăng nhập Console",
Actor.builder().username(username).build(), EventStatus.SUCCESS);

Bước 4 — đánh dấu method cần trace và đọc trace id trong code:

@Trace
public void handleCallback(String payload) {
String traceId = TraceUtils.get();
// ...
}

Lưu ý

  • Muốn lưu audit vào database (govex.log.save-log=true) cần govex-cloud-data-jpa trên classpath và bảng sys_log đã tồn tại; changelog có sẵn tại db/changelog/log/changelog-master.yaml.
  • Listener lưu log chạy bất đồng bộ (@Async), ứng dụng cần bật async thì bản ghi mới được ghi xuống database.
  • Trace id nhận từ header X-Request-ID hoặc tham số requestId, nếu không có thì tự sinh; header response trả về requestId.
  • Ba property govex.log.level, govex.log.show-args, govex.log.show-response tồn tại trong cấu hình chung nhưng không điều khiển hành vi ghi log; hãy cấu hình bằng thuộc tính annotation @SysLog tương ứng.
  • Annotation hoạt động qua AOP proxy: gọi method có annotation từ method khác trong cùng class sẽ không kích hoạt aspect.
  • Aspect ghi log cần bean UserAgentParser từ govex-cloud-web; dùng SysLogContext.clear() sau khi xử lý xong để tránh rò rỉ ngữ cảnh giữa các request.