Python - Ghi nhật ký

Xin chào các bạn, các nhà lập trình Python mới nhảy! Hôm nay, chúng ta sẽ bơi lội vào thế giới kỳ diệu của việc ghi nhật ký trong Python. Là một giáo viên máy tính hàng xóm thân thiện, tôi rất hứng thú để hướng dẫn các bạn trong chuyến hành trình này. Hãy tin tôi, bằng khi kết thúc hướng dẫn này, các bạn sẽ ghi nhật ký như một chuyên gia!

Python - Logging

Ghi nhật ký trong Python

Hãy tưởng tượng bạn là một phát triển đang cố gắng giải quyết một vụ án bí ẩn. Bạn có muốn theo dõi tất cả các dẫn chứng mà bạn tìm thấy, phải không? Đúng vậy, đó chính là điều gì ghi nhật ký làm trong lập trình! Nó giúp chúng ta theo dõi những gì đang diễn ra trong mã của chúng ta khi nó chạy.

Python đi kèm với một mô-đun logging tích hợp sẵn giúp quá trình này trở nên dễ dàng. Nó như có một cuốn sổ tay đáng tin cậy tự động ghi lại các thông tin quan trọng cho bạn.

Lợi ích của Ghi nhật ký

Bây giờ, bạn có thể tự hỏi, "Tại sao phải chịu khó ghi nhật ký khi tôi có thể chỉ sử dụng câu lệnh in ra?" Đây là một câu hỏi tuyệt vời! Hãy để tôi chia sẻ một câu chuyện nhỏ từ những ngày lập trình đầu tiên của mình.

Một lần tôi đã dành hàng giờ để gỡ lỗi một chương trình bằng các câu lệnh in ra. Như thể tìm một mũi kim trong rừng cỏ! Đó là khi tôi phát hiện ra siêu nhiệt của ghi nhật ký. Dưới đây là một số lợi ích:

  1. Độ linh hoạt: Không giống như các câu lệnh in ra, các bản ghi có thể dễ dàng bật/tắt mà không cần sửa đổi mã.
  2. Mức độ nghiêm trọng: Bạn có thể phân loại các bản ghi dựa trên mức độ quan trọng của chúng.
  3. Kiểm soát đầu ra: Các bản ghi có thể chỉ định đến các tệp, bàn giao tiếp, hoặc thậm chí các máy chủ từ xa!
  4. Hiệu suất: Ghi nhật ký có ảnh hưởng thấp hơn đến hiệu suất so với các câu lệnh in ra.

Các thành phần của Ghi nhật ký Python

Hãy phân tích các thành phần chính của ghi nhật ký Python:

  1. Loggers: Đây là các điểm vào hệ thống ghi nhật ký.
  2. Handlers: Chúng gửi các bản ghi log đến các đích phù hợp.
  3. Formatters: Chúng xác định cấu trúc của các bản ghi log trong đầu ra cuối cùng.
  4. Filters: Chúng cung cấp kiểm soát bổ sung về những bản ghi log nào cần được đầu ra.

Hãy tưởng tượng nó như một dây chuyền trong một nhà máy. Logger là nhân viên phát hiện vấn đề, handler quyết định nơi gửi báo cáo, formatter quyết định báo cáo nên trông như thế nào, và filter quyết định những báo cáo quan trọng đủ để chuyển tiếp.

Các mức độ của Ghi nhật ký

Ghi nhật ký Python có پنج mức độ nghiêm trọng tiêu chuẩn. Hãy xem chúng trong một bảng hữu ích:

Mức độ Giá trị Số Mô tả
DEBUG 10 Thông tin chi tiết, thường chỉ quan tâm khi chẩn đoán vấn đề.
INFO 20 Xác nhận rằng mọi thứ đang hoạt động như mong đợi.
WARNING 30 Dấu hiệu cho rằng có điều gì không mong muốn xảy ra, hoặc dẫn đến vấn đề trong tương lai gần.
ERROR 40 Do vấn đề nghiêm trọng hơn, phần mềm không thể thực hiện một số chức năng.
CRITICAL 50 Lỗi nghiêm trọng, chỉ ra rằng chương trình có thể không thể tiếp tục chạy.

Ví dụ Ghi nhật ký Cơ bản

Hãy bắt đầu với một ví dụ đơn giản để thử nghiệm:

import logging

# Cấu hình ghi nhật ký cơ bản
logging.basicConfig(level=logging.INFO)

# Tạo một logger
logger = logging.getLogger(__name__)

# Ghi lại một số thông điệp
logger.debug("Đây là một thông điệp gỡ lỗi")
logger.info("Đây là một thông điệp thông tin")
logger.warning("Đây là một thông điệp cảnh báo")
logger.error("Đây là một thông điệp lỗi")
logger.critical("Đây là một thông điệp nghiêm trọng")

Nếu bạn chạy mã này, bạn sẽ thấy đầu ra tương tự như sau:

INFO:__main__:Đây là một thông điệp thông tin
WARNING:__main__:Đây là một thông điệp cảnh báo
ERROR:__main__:Đây là một thông điệp lỗi
CRITICAL:__main__:Đây là một thông điệp nghiêm trọng

Bạn thấy chỗ mà thông điệp DEBUG không xuất hiện không? Đó là vì chúng ta đã đặt mức cấu hình cơ bản là INFO. Bất kỳ điều gì dưới INFO (như DEBUG) sẽ không được ghi lại trừ khi chúng ta thay đổi cấu hình.

Cấu hình Ghi nhật ký

Bây giờ, hãy làm cho việc ghi nhật ký của chúng ta trở nên phức tạp hơn:

import logging

# Cấu hình ghi nhật ký
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filename='app.log'
)

logger = logging.getLogger(__name__)

logger.debug("Thông điệp gỡ lỗi")
logger.info("Thông điệp thông tin")
logger.warning("Thông điệp cảnh báo")
logger.error("Thông điệp lỗi")
logger.critical("Thông điệp nghiêm trọng")

Trong ví dụ này, chúng ta đã:

  1. Đặt mức ghi nhật ký là DEBUG
  2. Xác định định dạng cho các thông điệp ghi nhật ký
  3. Chỉ định đầu ra vào tệp có tên 'app.log'

Nếu bạn kiểm tra tệp 'app.log', bạn sẽ thấy các thông điệp ghi nhật ký có định dạng đẹp với dấu thời gian!

Handlers Ghi nhật ký

Handlers giống như dịch vụ bưu chính của thế giới ghi nhật ký. Chúng xác định nơi các thông điệp ghi nhật ký của bạn sẽ kết thúc. Hãy xem một ví dụ sử dụng nhiều handlers:

import logging

# Tạo một logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# Tạo handlers
c_handler = logging.StreamHandler()  # Handler bàn giao tiếp
f_handler = logging.FileHandler('file.log')  # Handler tệp
c_handler.setLevel(logging.WARNING)
f_handler.setLevel(logging.ERROR)

# Tạo formatters và thêm vào handlers
c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
c_handler.setFormatter(c_format)
f_handler.setFormatter(f_format)

# Thêm handlers vào logger
logger.addHandler(c_handler)
logger.addHandler(f_handler)

# Kiểm tra logger
logger.debug('Đây là một thông điệp gỡ lỗi')
logger.info('Đây là một thông điệp thông tin')
logger.warning('Đây là một thông điệp cảnh báo')
logger.error('Đây là một thông điệp lỗi')
logger.critical('Đây là một thông điệp nghiêm trọng')

Trong ví dụ này, chúng ta đã thiết lập hai handlers:

  1. Một StreamHandler xuất các thông điệp CẢNH BÁO và trên ra bàn giao tiếp
  2. Một FileHandler ghi các thông điệp LỖI và trên vào tệp

Chạy mã này, và bạn sẽ thấy các thông điệp CẢNH BÁO và trên trong bàn giao tiếp, trong khi chỉ các thông điệp LỖI và NGHIÊM TRỐNG được lưu vào tệp.

Và thế là đã xong, các bạn! Bạn đã bước ra những bước đầu tiên vào thế giới ghi nhật ký Python. Hãy nhớ, luyện tập sẽ làm bạn hoàn hảo. Hãy thử nghiệm các cấu hình khác nhau và xem điều gì hoạt động tốt nhất cho các dự án của bạn.

Chúc các bạn ghi nhật ký vui vẻ, và may mắn mã của bạn luôn không có lỗi!

Credits: Image by storyset