Giới thiệu về Python Logging
Bạn đã bao giờ tự hỏi tại sao print() không đủ cho việc debug không? Khi dự án Python của bạn trở nên phức tạp với hàng trăm dòng code, việc sử dụng print() để theo dõi lỗi sẽ trở thành cơn ác mộng. Bạn sẽ phải xóa từng dòng print() trước khi deploy, rồi lại thêm vào khi cần debug – một quá trình vô cùng mệt mỏi và không chuyên nghiệp.

Vấn đề khi không dùng logging rất rõ ràng: thiếu kiểm soát và khó theo dõi lỗi trong dự án phức tạp. Bạn không thể phân loại mức độ nghiêm trọng của các thông báo, không thể lưu log vào file để phân tích sau này, và đặc biệt là không thể quản lý log một cách có hệ thống.
Python logging chính là giải pháp chuyên nghiệp để ghi nhật ký ứng dụng hiệu quả. Module logging tích hợp sẵn trong Python cung cấp một hệ thống linh hoạt và mạnh mẽ để ghi lại các sự kiện trong ứng dụng của bạn. Với logging, bạn có thể kiểm soát được thông tin nào được ghi, ở đâu và như thế nào.
Bài viết này sẽ hướng dẫn bạn từng bước cách thiết lập, sử dụng và mở rộng module logging. Từ những cấu hình cơ bản nhất đến các kỹ thuật nâng cao, tôi sẽ chia sẻ kinh nghiệm thực tế giúp bạn master được Python logging một cách nhanh chóng và hiệu quả.
Cài đặt Logging Cơ Bản
Tạo logger với logging.getLogger()
Logger chính là trái tim của hệ thống logging. Bạn có thể hiểu logger như một “người ghi chép” chuyên trách ghi lại các sự kiện trong ứng dụng. Cách tạo logger đơn giản nhất là sử dụng logging.getLogger()
.

import logging
# Tạo logger với tên cụ thể
logger = logging.getLogger('my_app')
logger.info('Đây là thông báo đầu tiên')
Ý nghĩa của việc dùng nhiều logger phân biệt chức năng rất quan trọng. Thay vì chỉ dùng một logger duy nhất, bạn có thể tạo nhiều logger khác nhau cho từng module hoặc tính năng. Ví dụ: một logger cho database, một logger cho API calls, và một logger cho user authentication. Điều này giúp bạn dễ dàng lọc và phân tích log theo từng chức năng cụ thể.
Để hiểu rõ hơn về cách khai báo và tổ chức mã nguồn trong Python, bạn có thể tham khảo Hàm trong Python giúp tổ chức code hiệu quả hơn trong dự án.
Thiết lập mức độ logging với setLevel()
Python logging có 5 mức độ (levels) chính, từ thấp đến cao: DEBUG, INFO, WARNING, ERROR, CRITICAL. Mỗi mức độ phục vụ một mục đích riêng biệt và bạn cần hiểu rõ để sử dụng đúng cách.

- DEBUG: Thông tin chi tiết nhất, thường dùng khi phát triển
- INFO: Thông tin chung về hoạt động bình thường của ứng dụng
- WARNING: Cảnh báo về vấn đề có thể xảy ra nhưng chưa nghiêm trọng
- ERROR: Lỗi đã xảy ra nhưng ứng dụng vẫn chạy được
- CRITICAL: Lỗi nghiêm trọng, có thể làm crash ứng dụng
import logging
logger = logging.getLogger('test_logger')
logger.setLevel(logging.INFO)
logger.debug('Debug message') # Không hiển thị
logger.info('Info message') # Hiển thị
logger.warning('Warning message') # Hiển thị
Khi bạn set level là INFO, chỉ các message từ INFO trở lên mới được ghi ra. DEBUG sẽ bị bỏ qua.
Để hiểu sâu hơn về các kiểu dữ liệu và cách xử lý hiệu quả trong Python, bạn có thể xem thêm bài viết về Kiểu dữ liệu trong Python giúp kiểm soát và tối ưu thao tác với dữ liệu.
Cấu hình logging.basicConfig()
basicConfig()
là cách nhanh nhất để cấu hình logging cơ bản cho ứng dụng Python. Đây là điểm khởi đầu tuyệt vời cho người mới bắt đầu.
import logging
logging.basicConfig(
filename='app.log',
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
Các tham số phổ biến bạn cần biết:
- filename: File để lưu log
- level: Mức độ log tối thiểu
- format: Định dạng message
- datefmt: Định dạng ngày tháng
Ví Dụ Thực Tế
Code mẫu đơn giản để bắt đầu
Hãy cùng xem một ví dụ thực tế để hiểu rõ cách logging hoạt động:

import logging
# Cấu hình cơ bản
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
# Tạo logger
logger = logging.getLogger(__name__)
# Các ví dụ ghi log
logger.debug('Đây là debug message')
logger.info('Ứng dụng đã khởi động thành công')
logger.warning('Cảnh báo: Dung lượng disk thấp')
logger.error('Lỗi kết nối database')
logger.critical('Hệ thống gặp sự cố nghiêm trọng')
Giải thích từng dòng code: Đầu tiên, chúng ta import module logging. Sau đó cấu hình cơ bản với basicConfig()
, thiết lập level là INFO và format hiển thị thời gian, level và message. Cuối cùng là tạo logger và thử nghiệm với các mức độ khác nhau.
Để tìm hiểu thêm về cách sử dụng vòng lặp for hiệu quả khi xử lý các bản ghi log hoặc dữ liệu liên quan, bạn có thể tham khảo bài viết Vòng lặp for trong Python.
Ghi log vào file với các định dạng khác nhau
Việc ghi log vào file rất quan trọng để phân tích sau này. Đây là cách cấu hình logging lưu vào file:

import logging
# Cấu hình ghi vào file
logging.basicConfig(
filename='my_app.log',
level=logging.DEBUG,
format='%(asctime)s | %(name)s | %(levelname)s | %(message)s',
datefmt='%d/%m/%Y %H:%M:%S'
)
logger = logging.getLogger('FileLogger')
logger.info('Log này sẽ được ghi vào file my_app.log')
So sánh giữa ghi log trên console và file: Console logging giúp bạn theo dõi real-time trong quá trình phát triển, trong khi file logging lưu trữ lâu dài để phân tích và debug sau này. Bạn có thể cấu hình để ghi đồng thời ra cả console và file.
Các Phương Pháp Nâng Cao
Tạo custom logger
Khi ứng dụng phức tạp, bạn cần tạo logger riêng biệt cho từng module hoặc tính năng. Đây là cách tạo custom logger chuyên nghiệp:

import logging
# Tạo custom logger cho database
db_logger = logging.getLogger('database')
db_logger.setLevel(logging.DEBUG)
# Tạo custom logger cho API
api_logger = logging.getLogger('api')
api_logger.setLevel(logging.INFO)
# Sử dụng
db_logger.info('Kết nối database thành công')
api_logger.warning('API response chậm hơn bình thường')
Lợi ích của việc custom logger: giúp bạn quản lý log chi tiết và có tổ chức. Bạn có thể thiết lập mức độ logging khác nhau cho từng component, dễ dàng lọc log theo chức năng, và tạo các handler riêng biệt để xử lý log theo cách khác nhau.
Nếu bạn muốn khám phá thêm các kỹ thuật xử lý và tối ưu dữ liệu hiệu quả hơn, bài viết List trong Python sẽ giúp bạn làm việc với các tập dữ liệu linh hoạt mà thường cần logging để theo dõi.
Xử lý lỗi và exception logging
Đây là một trong những tính năng mạnh mẽ nhất của Python logging – khả năng ghi lại thông tin lỗi chi tiết:
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
try:
result = 10 / 0
except ZeroDivisionError:
logger.exception('Lỗi chia cho 0 đã xảy ra')
# Hoặc sử dụng
logger.error('Lỗi chia cho 0', exc_info=True)
Tại sao logging giúp debug dễ dàng hơn print traceback? Vì logging.exception() tự động ghi lại full traceback cùng với context, timestamp và level. Điều này giúp bạn có đầy đủ thông tin để reproduce và fix bug.
Các Vấn Đề Thường Gặp & Cách Khắc Phục
Logger không ghi log ra file hoặc console

Nguyên nhân phổ biến nhất là cấu hình sai hoặc setLevel chưa đúng. Kiểm tra các bước sau:
- Đảm bảo bạn đã gọi
basicConfig()
trước khi sử dụng logger
- Kiểm tra level của logger có phù hợp với level của message không
- Verify đường dẫn file có tồn tại và có quyền ghi
import logging
# Cách kiểm tra và debug
logger = logging.getLogger('test')
logger.setLevel(logging.DEBUG)
# Thêm handler để debug
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
logger.debug('Test message') # Bây giờ sẽ hiển thị
Log trùng lặp hoặc bị mất log
Hiện tượng log chạy 2 lần thường do multiple handlers. Khi bạn add handler nhiều lần hoặc không cấu hình propagate đúng cách:
import logging
logger = logging.getLogger('duplicate_test')
# Tránh add handler nhiều lần
if not logger.handlers:
handler = logging.StreamHandler()
logger.addHandler(handler)
# Hoặc disable propagation
logger.propagate = False
Best Practices

Dựa trên kinh nghiệm thực tế, tôi khuyên bạn nên áp dụng những nguyên tắc sau:
- Luôn đặt mức logging phù hợp với môi trường. Trong development, bạn có thể dùng DEBUG để xem mọi thứ. Nhưng trong production, chỉ nên dùng INFO trở lên để tránh spam log.
- Sử dụng logger riêng biệt cho từng module. Thay vì dùng root logger cho tất cả, hãy tạo logger theo pattern
__name__
để dễ tracking.
- Đặt format log rõ ràng. Include timestamp, level, module name và message. Điều này giúp bạn debug nhanh chóng khi có vấn đề.
- Tránh ghi thông tin nhạy cảm trong log. Không bao giờ log password, API keys hay sensitive data. Luôn sanitize input trước khi log.
- Tận dụng logging để monitoring. Logging không chỉ để debug mà còn để monitor performance và user behavior.
Để bổ trợ kỹ năng quản lý biến hiệu quả và cách xử lý lỗi trong lập trình, bài viết về Biến trong Python là nguồn tham khảo hữu ích cho bạn.
Kết Luận
Python logging thực sự là công cụ mạnh mẽ giúp bạn tổ chức và quản lý log một cách chuyên nghiệp. Thay vì dùng print() như cách làm nghiệp dư, logging mang lại cho bạn khả năng kiểm soát hoàn toàn thông tin debug và monitoring.

Bắt đầu từ những cấu hình đơn giản với basicConfig()
, bạn hoàn toàn có thể mở rộng và tùy chỉnh theo nhu cầu dự án. Từ việc tạo custom logger, xử lý exception logging đến các kỹ thuật nâng cao – tất cả đều có thể học được một cách dần dần.
Hãy áp dụng logging trong dự án ngay hôm nay để tiết kiệm thời gian debug và nâng cao chất lượng code. Bạn sẽ ngạc nhiên về sự khác biệt mà nó mang lại, đặc biệt khi dự án trở nên phức tạp.
Đừng ngần ngại thử nghiệm và cải thiện kỹ năng logging. Hãy bắt đầu với những ví dụ đơn giản trong bài viết này, rồi dần dần explore các tính năng advanced hơn như Handlers, Formatters và Filters.
Nếu bạn muốn học thêm về Python hoặc các kỹ thuật lập trình khác, hãy theo dõi Bùi Mạnh Đức để cập nhật kiến thức mới nhất. Chúng tôi luôn chia sẻ những kinh nghiệm thực tế và hướng dẫn chi tiết giúp bạn trở thành developer giỏi hơn mỗi ngày.
Bạn cũng có thể tải Tài liệu học Python miễn phí từ kho tài nguyên của Bùi Mạnh Đức để phục vụ việc học và áp dụng Python hiệu quả.