Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Python Logging: Hướng Dẫn Chi Tiết

Bạn vừa xây ứng dụng và nhận ra điều gì không hoạt động như dự định. Tính năng vừa triển khai hành xử cách bạn không mong đợi. Bạn nên làm gì? Bạn giải quyết vấn đề như thế nào?

Trong phát triển phần mềm, lập trình viên dựa vào logging (ghi nhật ký) theo dõi sự kiện khi phần mềm chạy. Điều này giúp họ tìm nguồn gốc vấn đề hiệu quả khi nảy sinh.

Trong hướng dẫn này, chúng ta nói về tại sao nên giữ nhật ký ứng dụng và cách dùng module logging Python theo dõi sự kiện chương trình.

Tại Sao Nên Giữ Nhật Ký (Logs)

Giữ nhật ký giúp viết mã dễ bảo trì hơn. Khi dùng module logging, bạn giữ bản ghi chính xác tất cả sự kiện xảy ra chương trình. Nghĩa là bạn thấy dòng mã nào chạy và dòng nào không thực thi.

Trong Python, lập trình viên thường dùng câu lệnh print() ghi log mã. Thói quen mọi người – từ người mới đến chuyên gia – dùng có lý do. Câu lệnh print() dễ dùng; đơn giản.

Tuy nhiên, print() không phải cách tốt nhất giữ log mã. Thứ nhất, print() in bất kỳ đầu ra nào ra bảng điều khiển. Nghĩa là khó phân biệt đầu ra nào lưu log, đầu ra nào phần chương trình chính. Thứ hai, print() không lưu log mặc định.

Đó là lúc module logging Python hữu ích. Dùng hệ thống logging, bạn giữ bản ghi chính xác hơn sự kiện chạy mã. Giúp debug hiệu quả và sửa lỗi.

Cách Dùng Module Logging Python

Hướng dẫn này, chúng ta thêm thông điệp logging cơ bản vào chương trình duyệt danh sách điểm học sinh tính đậu/rớt. Xem mã:

students = ["Martin", "Lewis", "Terri", "Bart"]
grades = [92, 78, 72, 38]
pass_fail = []
for i in range(0, len(students)):
    print("Calculating grade for {}".format(students[i]))
    if grades[i] > 55:
        pass_fail.append(True)
        print("{} has passed their exam.".format(students[i]))
    else:
        pass_fail.append(False)
        print("{} has failed their exam.".format(students[i]))
print("Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.")

Mã tính năm học sinh lớp 4 đậu/rớt. Chương trình khai báo ba danh sách. Một lưu tên học sinh; một lưu điểm; cuối lưu đậu/rớt.

Chạy chương trình, trả về:

Calculating grade for Martin.
Martin has passed their exam.
Calculating grade for Lewis.
Lewis has passed their exam.
Calculating grades for Terri.
Terri has passed their exam.
Calculating grades for Bart.
Bart has failed their exam.

Câu lệnh print() cho thấy mã hoạt động, nhưng dùng module logging() hiển thị dữ liệu. Cho phép phân biệt thông điệp debug và đầu ra chương trình.

Đầu, thêm thư viện logging chuẩn đầu chương trình:

import logging

Đã nhập logging, bắt đầu theo dõi log mã. Ví dụ dùng cấu hình DEBUG. Vì không quan tâm theo dõi cảnh báo. Tham khảo tùy chọn logging:

  • CRITICAL: Hiển thị lỗi nghiêm trọng (logging.critical())
  • ERROR: Hiển thị vấn đề (logging.error())
  • WARNING: Hiển thị hành vi bất ngờ (logging.warning())
  • INFO: Hiển thị chương trình hoạt động (logging.info())
  • DEBUG: Debug mã (logging.debug())

Cấu hình mặc định logging là WARNING, phải đặt lại bằng mã:

import logging
logging.basicConfig(level=logging.DEBUG)

Giờ sẵn sàng debug mã. Thay câu lệnh print() báo tính điểm hoặc chương trình kết thúc bằng câu lệnh debug:

import logging
logging.basicConfig(level=logging.DEBUG)
students = ["Martin", "Lewis", "Terri", "Bart"]
grades = [92, 78, 72, 38]
pass_fail = []
for i in range(0, len(students)):
    logging.debug("Calculating grade for {}".format(students[i]))
    if grades[i] > 55:
        pass_fail.append(True)
        print("{} has passed their exam.".format(students[i]))
    else:
        pass_fail.append(False)
        print("{} has failed their exam.".format(students[i]))
logging.debug("Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.")

Chạy mã, trả về:

DEBUG:root:Calculating grade for Martin
Martin has passed their exam.
DEBUG:root:Calculating grade for Lewis
Lewis has passed their exam.
DEBUG:root:Calculating grade for Terri
Terri has passed their exam.
DEBUG:root:Calculating grade for Bart
Bart has failed their exam.
DEBUG:root:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.

Bạn thấy đầu ra chứa nội dung giống trước. Tuy nhiên, thông điệp "Calculating grade for..." và thông báo điểm đã tính xuất hiện khác. Văn bản "DEBUG:root:" xuất hiện trước câu lệnh.

Điều này cho phép theo dõi chương trình làm gì tại thời điểm. Vì module logging thêm văn bản, dễ phân biệt văn bản đầu ra chương trình và văn bản debug.

Trường hợp này, thông điệp "[student] has failed their exam" là thông tin quan trọng cho biết học sinh đậu/rớt. Mọi thứ khác hữu ích xem chương trình chạy, nhưng không hữu ích người dùng. Do đó, theo dõi câu lệnh dùng logging calls.

Cách Giữ Log Trong File

Module logging cho phép giữ log trong file. Hữu ích vì không mất log khi đóng shell Python. Có bản ghi vĩnh viễn chương trình thực thi dịp cụ thể.

Chỉ cần thêm tham số filename cấu hình logging handler, chương trình tự lưu log file:

import logging
logging.basicConfig(level=logging.DEBUG, filename="student_data.log")
...

Chạy mã, log thêm vào filename chỉ định. Mở "student_data.log", trả về:

DEBUG:root:Calculating grade for Martin
DEBUG:root:Calculating grade for Lewis
DEBUG:root:Calculating grade for Terri
DEBUG:root:Calculating grade for Bart
DEBUG:root:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.

Chú ý đầu ra debug chỉ chứa thông điệp chỉ định log dùng logging.debug(). Hữu ích phân biệt đầu ra chương trình – dùng print() – từ log debug.

Bạn cũng thêm tham số theo dõi thời điểm entry thêm log. Làm bằng mã:

logging.basicConfig(
    level=logging.DEBUG,
    filename="student_data.log",
    format="%(asctime)s:%(levelname)s:%(message)s"
)

Mã thêm vào student_data.log:

2020-06-18 08:27:50,123:DEBUG:Calculating grade for Martin
2020-06-18 08:27:50,123:DEBUG:Calculating grade for Lewis
2020-06-18 08:27:50,123:DEBUG:Calculating grade for Terri
2020-06-18 08:27:50,123:DEBUG:Calculating grade for Bart
2020-06-18 08:27:50,124:DEBUG:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.

Giờ biết khi nào mỗi dòng mã thực thi. Chương trình dài, dữ liệu đặc biệt hữu ích vì hiểu thứ tự mã chạy và tốc độ.

Kết Luận

Module logging Python công cụ cực hữu ích debug. Giúp theo dõi tất cả sự kiện chạy chương trình và tùy chọn lưu sự kiện file riêng. Giúp debug hiệu quả và hiểu sự kiện thực thi khi chạy chương trình.