Tạm biệt module logging tiêu chuẩn, mình chọn Loguru
Nếu bạn từng mất cả buổi sáng chỉ để config module logging mặc định của Python, bạn sẽ hiểu sự ức chế này. Nào là tạo logger, định nghĩa handler, thiết lập formatter, rồi lại phải gán handler vào logger… Quá nhiều boilerplate code chỉ để in ra một dòng thông báo lỗi.
Loguru sinh ra để giải quyết đống lằng nhằng đó. Triết lý của nó cực kỳ thực dụng: “Logging made simple”. Bạn không cần học lại từ đầu, không cần cấu hình phức tạp, chỉ cần import và dùng. Sau nhiều dự án backend, mình nhận ra việc tập trung vào logic nghiệp vụ quan trọng hơn nhiều so với việc ngồi chỉnh từng dấu phẩy trong format log.
Thực tế từ dự án của mình: Một script ban đầu chỉ 200 dòng, sau khi scale lên 2000 dòng với nhiều luồng chạy song song, log mặc định bắt đầu lộ điểm yếu. Lúc đó, việc chuyển sang Loguru giúp mình tiết kiệm 70% thời gian debug mỗi khi hệ thống gặp sự cố (incident).
Cài đặt trong 3 giây
Mở terminal và cài đặt thư viện qua pip:
pip install loguru
Thư viện này rất nhẹ và không kéo theo các dependency rắc rối khác.
Tư duy “Một cho tất cả”
Trong module logging chuẩn, bạn thường phải tạo instance riêng cho mỗi module. Với Loguru, bạn chỉ làm việc với một đối tượng logger duy nhất. Hệ thống của Loguru xoay quanh khái niệm Sinks.
Sink là nơi bạn muốn đẩy dữ liệu log đến: terminal, file, email, hay thậm chí là Slack. Thay vì tạo handler dài dòng, bạn chỉ cần dùng đúng một hàm .add().
Thực hành: Từ in log màu mè đến quản lý file chuyên nghiệp
1. Log có màu sắc (Dễ nhìn, dễ quản lý)
Điểm cộng lớn nhất khi mới dùng Loguru là màu sắc. Thư viện tự động tô màu các level (INFO màu xanh, ERROR màu đỏ). Bạn sẽ không còn phải “căng mắt” tìm lỗi giữa một rừng text đen trắng khi server đang bắn log liên tục.
from loguru import logger
logger.debug("Thông tin debug - chỉ dùng lúc phát triển")
logger.info("Hệ thống đã khởi chạy thành công")
logger.warning("Cảnh báo: RAM đang chiếm hơn 80%")
logger.error("Lỗi kết nối database (Retry lần 3)")
logger.critical("Hệ thống dừng đột ngột!")
Mỗi dòng log mặc định đã có sẵn: Thời gian (ISO 8601), Level, Tên file, và số dòng code chính xác. Bạn được hưởng toàn bộ tiện ích này mà không cần viết thêm dòng config nào.
2. Ghi log ra file và tự động nén (Rotation)
Đừng bao giờ để file log phình to đến vài GB vì nó sẽ làm treo server. Loguru xử lý việc này cực kỳ thông minh qua các tham số của hàm add().
# Tạo file mới khi file cũ đạt 500 MB
logger.add("app.log", rotation="500 MB")
# Mỗi ngày tạo một file log mới vào lúc 12 giờ trưa
logger.add("daily.log", rotation="12:00")
# Chỉ giữ log trong 10 ngày để tiết kiệm dung lượng
logger.add("cleanup.log", retention="10 days")
# Nén log cũ thành file .zip để lưu trữ
logger.add("archive.log", compression="zip")
So với việc phải dùng RotatingFileHandler rườm rà trong module chuẩn, cách làm này trực quan hơn rất nhiều.
3. Bắt lỗi thần tốc với @logger.catch
Đây là tính năng “đáng tiền” nhất. Thông thường khi code crash, Python in ra traceback rất khó đọc. Decorator @logger.catch sẽ bọc hàm của bạn lại và phân tích chi tiết các biến tại thời điểm lỗi.
@logger.catch
def process_data(a, b):
return a / b
# Nếu b = 0, Loguru sẽ hiện luôn giá trị của a và b trong traceback
process_data(10, 0)
Kinh nghiệm của mình là tính năng này giúp giảm thời gian tìm bug từ 30 phút xuống còn 3 phút, vì bạn nhìn thấy ngay giá trị sai lệch mà không cần đặt print để debug.
4. Xuất log dạng JSON cho hệ thống ELK/Grafana
Khi làm dự án lớn, log cần được cấu trúc hóa để các công cụ như Elasticsearch hoặc Loki có thể đọc được.
# Chỉ cần thêm serialize=True
logger.add("server.json", serialize=True)
Bây giờ mỗi dòng log là một object JSON hoàn chỉnh, chứa từ timestamp đến thông tin thread và process.
Mẹo nhỏ khi triển khai thực tế
Khi dự án phát triển từ script nhỏ thành hệ thống microservices, hãy lưu ý:
- Sử dụng Enqueue: Thêm
enqueue=Truetrong hàmadd()để ghi log bất đồng bộ. Điều này giúp app không bị chậm khi phải đợi ghi file log vào ổ cứng. - Tách biệt môi trường: Ở môi trường Dev, hãy để log ở mức
DEBUG. Khi lên Production, hãy nâng lênINFOhoặcSUCCESSđể tránh làm đầy ổ cứng vô ích. - Format tùy biến: Bạn có thể làm gọn dòng log bằng cách định nghĩa lại format:
logger.add("short.log", format="{time:HH:mm:ss} | {level} | {message}")
Kết luận
Logging tốt không chỉ để xem cho vui. Nó là sự khác biệt giữa việc ngủ ngon và việc phải thức trắng đêm để tìm một con bug “ma” trên production. Loguru giúp bạn làm việc đó một cách nhàn hạ và chuyên nghiệp hơn. Nếu bạn đang bắt đầu dự án Python mới, đừng ngần ngại cài ngay Loguru và bỏ qua module logging mặc định.

