Chuyển đến nội dung chính

Hướng dẫn Logging trong Python

Tìm hiểu các kiến thức cơ bản về Logging trong Python.
Đã cập nhật 5 thg 10, 2026  · 9 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Nếu bạn mới bắt đầu với Python và muốn học thêm, hãy tham gia khóa học Introduction to Data Science in Python của DataCamp.

Các cấp độ Logging
Các cấp độ Logging

Nói chung, logging là cách lưu lại nhật ký do một chương trình máy tính tạo ra. Một tệp log thường chứa tập hợp các bản ghi về những sự kiện xảy ra trong mã của bạn (ví dụ, mã Python) hoặc trong hệ điều hành. Các sự kiện hay thông điệp này được ghi vào tệp log; một thông điệp hay sự kiện cũng có thể là sự trao đổi giữa những người dùng khác nhau.

Việc tạo log thường tùy thuộc vào nhà phát triển. Có thể họ muốn ghi lại mọi thao tác của ứng dụng họ phát triển, chỉ ghi khi xảy ra lỗi, hoặc theo dõi những thao tác quan trọng do người dùng thực hiện và ghi lại chúng. Một thao tác quan trọng có thể là kiểm tra ứng dụng hay máy chủ được truy cập bởi người dùng cuối hoặc địa chỉ IP nào; trong trường hợp truy cập không thành công, nhà phát triển có thể dựa vào log để tìm hiểu nhiều hơn là chỉ một stack trace đơn thuần.

Một ví dụ điển hình là khi bạn cố cài đặt trên Linux với quyền sudo trong khi bạn không có quyền đó. Bạn sẽ thấy thông điệp "Xyz is not in the sudoers file. This incident will be reported", và thông điệp này được ghi vào tệp log.

Tin vui là Python đi kèm mô-đun logging tích hợp sẵn, bạn có thể dùng ngay mà không cần cài đặt.

Logging khác gì so với hàm Print?

Về tinh thần, logging tương tự như Print Function. Tuy nhiên, một hàm Print thiếu nhiều thông tin hữu ích cho nhà phát triển. Ngược lại, logging có thể ghi lại dấu thời gian và số dòng nơi xảy ra lỗi. Nó có thể ghi lỗi hoặc bất kỳ thông tin nào vào tệp, socket, v.v., và cung cấp năm mức độ nghiêm trọng giúp bạn phân loại log.

Năm cấp độ Logging như minh họa tại đây gồm:

  • Debug (10): Hữu ích để chẩn đoán vấn đề trong mã.

  • Info (20): Có thể xem như xác nhận rằng mã không có lỗi. Một ví dụ điển hình cho mức Info là theo dõi tiến trình huấn luyện mô hình học máy.

  • Warning (30): Chỉ báo về một vấn đề có thể xảy ra trong tương lai. Ví dụ, cảnh báo về một mô-đun có thể bị ngừng hỗ trợ hoặc cảnh báo dung lượng RAM thấp.

  • Error (40): Lỗi nghiêm trọng trong mã, có thể là lỗi cú pháp, lỗi tràn bộ nhớ, ngoại lệ.

  • Critical (50): Lỗi khiến chương trình có thể ngừng hoạt động hoặc thoát đột ngột.

Lý thuyết vậy là đủ rồi, phải không?

Bây giờ hãy xem cách bạn có thể triển khai logging trong mã Python.

Nhưng trước đó, hãy xem bảng thuộc tính logging; bạn sẽ sử dụng một số thuộc tính dưới đây trong bài hướng dẫn hôm nay.

bảng thuộc tính logging
Logging Attributes</a
import logging

Bây giờ bạn sẽ gọi phương thức basicConfig(), giúp tạo cấu hình cơ bản để hệ thống logging hoạt động trơn tru.

Nó cho phép bạn thiết lập các tham số sau:

  • mức độ nghiêm trọng của logging: năm cấp độ logging.
  • ghi các sự kiện vào tệp.
  • chỉ ghi log hiện tại bằng cách ghi đè log cũ với filemode.
  • định dạng tệp nơi log được lưu.

Lưu ý rằng phương thức basicConfig() là tùy chọn, bạn có thể bỏ qua.

logging.basicConfig()

Giờ hãy tạo năm mức độ nghiêm trọng.

logging.debug("A Debug Logging Message")
logging.info("A Info Logging Message")
logging.warning("A Warning Logging Message")
WARNING:root:A Warning Logging Message
logging.error("An Error Logging Message")
ERROR:root:An Error Logging Message
logging.critical("A Critical Logging Message")
CRITICAL:root:A Critical Logging Message

Như bạn thấy từ các đầu ra trên, chỉ những log có mức nghiêm trọng lớn hơn 20 mới được ghi thành công vì đó là cấu hình mặc định của logging trong Python.

Tuy nhiên, như đã đề cập, bạn có thể điều chỉnh mức nghiêm trọng bằng phương thức basicConfig(). Ở đây bạn sẽ đổi mức nghiêm trọng thành 20, nghĩa là các mức có độ nghiêm trọng lớn hơn 10 sẽ được ghi.

Lưu ý: Vui lòng khởi động lại kernel trước khi chạy các ô bên dưới để thấy đầu ra chính xác.

import logging
logging.basicConfig(level=logging.INFO)
logging.debug("A Debug Logging Message")
logging.info("A Info Logging Message")
INFO:root:A Info Logging Message
logging.warning("A Warning Logging Message")
WARNING:root:A Warning Logging Message
logging.error("An Error Logging Message")
ERROR:root:An Error Logging Message
logging.critical("A Critical Logging Message")
CRITICAL:root:A Critical Logging Message

Giờ hãy ghi các đầu ra trên vào một tệp log. Để làm điều này, bạn sẽ dùng phương thức basicConfig().

import logging
logging.basicConfig(level = logging.INFO, filename = 'datacamp.log')
logging.debug("A Debug Logging Message")
logging.info("A Info Logging Message")
logging.warning("A Warning Logging Message")
logging.error("An Error Logging Message")
logging.critical("A Critical Logging Message")
đầu ra

Như bạn thấy, giờ các log được tạo trong tệp log datacamp.log. Khi chạy các ô trên nhiều lần, bạn sẽ thấy log được thêm vào tệp tương ứng số lần chạy. Mặc định, tệp ở chế độ append.

đầu ra

Bạn có thể dùng từ khóa filemode để tránh việc tệp log bị ghi kèm nhiều bản sao log (tức chế độ append). Có thể chuyển filemode sang chế độ write, sẽ ghi đè các log trước đó và chỉ lưu các log hiện tại. Vì filemode đặt là w, tức tệp log sẽ được mở ở chế độ ghi mỗi lần chạy basicConfig(), và cuối cùng sẽ ghi đè tệp.

Chức năng file mode trong logging tương tự cách xử lý tệp tiêu chuẩn mà Python cung cấp.

import logging
logging.basicConfig(level = logging.INFO, filename = 'datacamp.log', filemode = 'w')
logging.debug("A Debug Logging Message")
logging.info("A Info Logging Message")
logging.warning("A Warning Logging Message")
logging.error("An Error Logging Message")
logging.critical("A Critical Logging Message")

Hãy chạy các dòng mã trên nhiều lần. Lần này bạn sẽ thấy chỉ các mục log hiện tại được lưu, và những mục trước đó bị ghi đè, như minh họa bên dưới.

đầu ra

Hãy xem thêm một số thuộc tính logging như ngày, giờ, số dòng nơi cảnh báo hoặc lỗi được tạo. Đến đây có lẽ bạn cũng đồng ý rằng đây đều là những ưu điểm so với một hàm Print đơn giản và mạnh hơn nhiều so với Print.

Để làm được điều này, bạn sẽ truyền các thuộc tính logging asctime và lineno. Bạn cũng sẽ truyền thuộc tính message, đóng vai trò chỗ chèn thông điệp bạn muốn hiển thị trong log. Tất cả các thuộc tính này sẽ được truyền vào tham số format.

import logging
logging.basicConfig(format='Date-Time : %(asctime)s : Line No. : %(lineno)d - %(message)s', \
                    level = logging.DEBUG)
logging.debug("A Debug Logging Message")
logging.info("A Info Logging Message")
logging.warning("A Warning Logging Message")
logging.error("An Error Logging Message")
logging.critical("A Critical Logging Message")
Date-Time : 2020-03-18 23:58:12,429 : Line No. : 1 - A Debug Logging Message
Date-Time : 2020-03-18 23:58:12,436 : Line No. : 2 - A Info Logging Message
Date-Time : 2020-03-18 23:58:12,437 : Line No. : 3 - A Warning Logging Message
Date-Time : 2020-03-18 23:58:12,440 : Line No. : 4 - An Error Logging Message
Date-Time : 2020-03-18 23:58:12,441 : Line No. : 5 - A Critical Logging Message

Hãy xem định nghĩa của từng thuộc tính trực tiếp từ bảng này.

  • asctime: Thời gian dạng dễ đọc khi LogRecord được tạo. Mặc định có dạng 2020-03-18 22:24:42,670 (các số sau dấu phẩy là mili giây). Vì thuộc tính này là chuỗi, bạn dùng ký tự s phía sau.

  • lineno: Số dòng nguồn nơi lời gọi logging được gọi. Vì thuộc tính này là số nguyên, bạn dùng ký tự d phía sau.

  • message: Thông điệp đã ghi, được tính là msg % args. Thuộc tính này được thiết lập khi Formatter.format() được gọi. Nếu bạn không chỉ định thuộc tính này khi dùng tham số format(), thông điệp bạn muốn ghi sẽ không được tạo. Tương tự, với thuộc tính message, bạn dùng s vì nó là chuỗi.

  • funcName: Xuất ra tên mô-đun hoặc hàm nơi log được tạo. Hữu ích khi bạn có nhiều hàm trong mã và muốn phân tách log theo hàm hoặc phương thức tương ứng.

Hãy lấy một ví dụ đơn giản và xem cách bạn có thể thay thế hàm print bằng hàm debug của logging.

import logging

logging.basicConfig(format='%(asctime)s :: %(levelname)s :: %(funcName)s :: %(lineno)d \
:: %(message)s', level = logging.INFO)

def addition(x, y):
    add = x + y
    return add


def subtract(x, y):
    sub = x - y
    return sub


def multiply(x, y):
    mul = x * y
    return mul


def divide(x, y):
    div = x / y
    return div

def exponent(x, y):
    exp = x ** y
    return exp


num1 = 20
num2 = 2

def main():
    add_result = addition(num1, num2)
    logging.info('Add: {} + {} = {}'.format(num1, num2, add_result))

    sub_result = subtract(num1, num2)
    logging.info('Sub: {} - {} = {}'.format(num1, num2, sub_result))

    mul_result = multiply(num1, num2)
    logging.info('Mul: {} * {} = {}'.format(num1, num2, mul_result))

    div_result = divide(num1, num2)
    logging.info('Div: {} / {} = {}'.format(num1, num2, div_result))

    exp_result = exponent(num1, num2)
    logging.info('Exp: {} ** {} = {}'.format(num1, num2, exp_result))


main()
2020-03-19 00:01:27,372 :: INFO :: main :: 35 :: Add: 20 + 2 = 22
2020-03-19 00:01:27,376 :: INFO :: main :: 38 :: Sub: 20 - 2 = 18
2020-03-19 00:01:27,377 :: INFO :: main :: 41 :: Mul: 20 * 2 = 40
2020-03-19 00:01:27,378 :: INFO :: main :: 44 :: Div: 20 / 2 = 10.0
2020-03-19 00:01:27,379 :: INFO :: main :: 47 :: Exp: 20 ** 2 = 400

Kết luận

Chúc mừng bạn đã hoàn thành bài hướng dẫn.

Bạn có thể thử các thuộc tính logging khác và tìm hiểu cách tận dụng chúng trong mã của mình.

Vui lòng đặt câu hỏi liên quan đến bài hướng dẫn này trong phần bình luận bên dưới.

Nếu bạn mới bắt đầu với Python và muốn học thêm, hãy tham gia khóa học Introduction to Data Science in Python của DataCamp.

Chủ đề
Python

Các khóa học Python

Khóa học

Nhập môn Python

4 giờ
7.1M
Nắm vững phân tích dữ liệu với Python chỉ trong 4 giờ. Khóa học online này giúp bạn làm quen với giao diện Python và các thư viện phổ biến.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm