spdlog là một thư viện ghi nhật ký mạnh mẽ trong C++ với nhiều tính năng tiên tiến. Nếu bạn đã từng sử dụng nó để ghi lại các thông tin cơ bản như khởi động chương trình hoặc gọi hàm, thì đây là thời điểm để khám phá những khả năng vượt trội hơn. Dưới đây là năm kỹ thuật nâng cao giúp bạn xây dựng hệ thống nhật ký linh hoạt và hiệu quả.
1. Định dạng nhật ký tùy chỉnh: Xây dựng cấu trúc phù hợp với nhu cầu
Mặc định, spdlog chỉ cung cấp một số thông tin cơ bản như thời gian, mức độ và nội dung. Tuy nhiên, trong các dự án thực tế, ta cần thêm nhiều ngữ cảnh khác. Ví dụ, khi gặp sự cố vào lúc 3 giờ sáng, việc có được thông tin về ID luồng, tệp nguồn và dòng mã sẽ rất hữu ích.| Chi tiết | Mô tả và ví dụ | Ứng dụng điển hình |
|---|---|---|
| %Ngay,%Thang,%Nam | Ngày-tháng-năm (ví dụ: 2023-10-27) | Lưu trữ nhật ký theo ngày |
| %Gio:%Phut:%Giay | Giờ-phút-giây (ví dụ: 14:30:05) | Sắp xếp sự kiện chính xác theo thời gian |
| %Miligiay | Mili giây (ví dụ: .123) | Phân tích hiệu suất chi tiết |
| %CapDo | Cấp độ nhật ký (ví dụ: INFO, ERROR) | Lọc nhanh lỗi và cảnh báo |
| %IDLuong | ID luồng (ví dụ: 1402) | Chẩn đoán vấn đề cạnh tranh giữa các luồng |
| %TenNhatKy | Tên bộ ghi nhật ký (ví dụ: network_logger) | Phân biệt nhật ký từ các hệ thống con khác nhau |
| %TinNhan | Nội dung nhật ký do người dùng cung cấp | Thông điệp chính của nhật ký |
logger->set_format("%Nam-%Thang-%Ngay %Gio:%Phut:%Giay.%Miligiay [%IDLuong] [%CapDo] [%Tep:%Dong %Ham!] %TinNhan");
Kết quả có thể như sau:
2023-10-27 14:30:05.123 [0x7fffe3bda700] [INFO] [main.cpp:15 process_data] Bắt đầu xử lý yêu cầu người dùng.Với định dạng này, bạn dễ dàng nắm bắt bối cảnh mà không cần mở trình gỡ lỗi.
2. Định dạng hóa tùy chỉnh: Thêm logic kinh doanh
Trong một số trường hợp, bạn cần thêm thông tin cụ thể như ID phiên người dùng hay số giao dịch. Bạn có thể tạo định dạng hóa tùy chỉnh bằng cách triển khai interfacecustom_flag_formatter. Ví dụ, thêm tiền tố [MODULE_A] cho mỗi nhật ký:
#include <spdlog/pattern_formatter.h>
#include <memory>
class CustomFormatter : public spdlog::custom_flag_formatter {
public:
void format(const spdlog::details::log_msg& msg, const std::tm& tm_time, spdlog::memory_buf_t& dest) override {
// Thêm logic tùy chỉnh tại đây
}
};
Việc sử dụng các kỹ thuật này giúp tăng cường khả năng và tính linh hoạt của hệ thống nhật ký.