Computer >> Máy Tính >  >> Lập trình >> Python

Ghi nhật ký Python:Hướng dẫn

Bạn vừa tạo một ứng dụng và nhận thấy có điều gì đó không hoạt động như dự kiến. Tính năng bạn vừa triển khai đang hoạt động theo cách bạn không mong đợi. Những gì bạn nên làm? Bạn sẽ giải quyết vấn đề này như thế nào?

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

Trong hướng dẫn này, chúng ta sẽ nói về lý do tại sao bạn nên lưu giữ nhật ký ứng dụng và cách bạn có thể sử dụng mô-đun ghi nhật ký Python để theo dõi các sự kiện trong chương trình của mình.

Tại sao bạn nên giữ nhật ký

Lưu giữ nhật ký giúp bạn viết mã dễ bảo trì hơn. Khi bạn sử dụng một mô-đun như ghi nhật ký, bạn có thể ghi lại chính xác tất cả các sự kiện xảy ra trong chương trình của mình. Điều này có nghĩa là bạn có thể xem dòng mã nào đã chạy và dòng nào không thực thi được.

Trong Python, các nhà phát triển thường dựa vào print() tuyên bố đăng nhập mã của họ. Tất cả mọi người - từ người mới bắt đầu đến chuyên gia - đều có lỗi khi sử dụng và có lý do chính đáng. Một print() câu lệnh rất dễ sử dụng; nó đơn giản.

Tuy nhiên, print() tuyên bố không phải là cách tốt nhất để giữ nhật ký mã của bạn. Đối với một điều, print() câu lệnh có thể được sử dụng để in bất kỳ đầu ra nào ra bảng điều khiển. Điều này có nghĩa là có thể gây nhầm lẫn khi phân biệt đầu ra nào sẽ được lưu trữ dưới dạng nhật ký và đầu ra nào là một phần của chương trình chính của bạn. Hơn thế nữa, print() tuyên bố không lưu nhật ký của bạn theo mặc định.

Đó là nơi mà mô-đun ghi nhật ký Python trở nên hữu ích. Sử dụng mô-đun hệ thống ghi nhật ký, bạn có thể giữ các bản ghi chính xác hơn về những sự kiện đã chạy trong mã của bạn. Điều này sẽ giúp bạn gỡ lỗi mã của mình hiệu quả hơn và sửa lỗi.

Cách sử dụng mô-đun ghi nhật ký Python

Trong hướng dẫn này, chúng tôi sẽ thêm các thông báo ghi nhật ký cơ bản vào một chương trình xem qua danh sách điểm của sinh viên và tính toán xem họ đã trượt hay đã vượt qua kỳ thi của mình. Hãy xem xét đoạn mã sau:

81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia chương trình đào tạo. Kết hợp với bootcamp ngay hôm nay.

Sinh viên tốt nghiệp bootcamp trung bình dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.

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.")

Đoạn mã trên tính toán xem mỗi trong số năm học sinh của một lớp thứ tư có vượt qua kỳ thi của mình hay không. Trong chương trình của chúng tôi, chúng tôi khai báo ba danh sách. Một danh sách lưu tên của từng học sinh; một danh sách khác lưu trữ điểm mà mỗi học sinh đạt được; danh sách cuối cùng lưu trữ xem một học sinh đã vượt qua hay thất bại trong kỳ thi của họ.

Khi chúng tôi chạy chương trình của mình, thông tin sau được 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.

print() câu lệnh cho thấy mã của chúng tôi đang hoạt động, nhưng chúng tôi có thể sử dụng logging() để hiển thị dữ liệu này thay thế. Điều này sẽ cho phép chúng tôi phân biệt các thông báo gỡ lỗi của chúng tôi với đầu ra của chương trình của chúng tôi.

Để bắt đầu, hãy thêm thư viện chuẩn ghi nhật ký vào đầu chương trình của chúng tôi:

import logging

Bây giờ chúng tôi đã nhập thư viện ghi nhật ký, chúng tôi có thể bắt đầu theo dõi các nhật ký trong mã của mình. Đối với ví dụ này, chúng tôi sẽ theo dõi các bản ghi bằng cách sử dụng cấu hình GỠ LỖI. Điều này là do chúng tôi không quan tâm đến việc theo dõi các cảnh báo tại thời điểm này. Để tham khảo, đây là các tùy chọn ghi nhật ký bạn có thể chỉ định:

  • CRITICAL:Được sử dụng để hiển thị các lỗi nghiêm trọng (logging.critical ())
  • LỖI:Được sử dụng để hiển thị sự cố (logging.error ())
  • CẢNH BÁO:Được sử dụng để hiển thị hành vi không mong muốn (logging.warning ())
  • THÔNG TIN:Được sử dụng để hiển thị một chương trình đang hoạt động (logging.info ())
  • Gỡ lỗi:Được sử dụng để gỡ lỗi mã (logging.debug ())

Cấu hình mặc định cho thư viện ghi nhật ký là CẢNH BÁO, vì vậy chúng tôi sẽ phải đặt lại nó bằng cách sử dụng mã sau:

import logging

logging.basicConfig(level=logging.DEBUG)

Bây giờ chúng tôi đã sẵn sàng để bắt đầu gỡ lỗi mã của mình. Hãy thay thế print() của chúng tôi các câu lệnh cho chúng tôi biết rằng một điểm đang được tính toán hoặc chương trình của chúng tôi đã kết thúc với các câu lệnh gỡ lỗi:

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.")

Khi chúng tôi chạy mã của mình, thông tin sau được 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 có thể thấy rằng đầu ra của chúng tôi chứa cùng một nội dung như trước đó. Tuy nhiên, thông báo “Đang tính điểm cho…” và thông báo cho chúng tôi biết rằng điểm đã được tính xuất hiện khác nhau. Văn bản “GỬI:root:” xuất hiện trước các câu lệnh đó.

Điều này cho phép chúng tôi theo dõi những gì chương trình của chúng tôi đang làm tại bất kỳ thời điểm nào. Bởi vì mô-đun sự kiện ghi nhật ký thêm văn bản nói trên vào chương trình của chúng tôi, nên dễ dàng tìm ra văn bản nào đã được chương trình của chúng tôi xuất ra và văn bản nào dùng để gỡ lỗi.

Trong trường hợp này, thông báo “[học sinh]” đã trượt kỳ thi của họ ”là thông tin quan trọng cho chúng tôi biết liệu mỗi học sinh đã đạt hay không đạt kỳ thi của mình. Mọi thứ khác đều hữu ích để xem chương trình của chúng tôi đang chạy như thế nào, nhưng không hữu ích cho người dùng. Do đó, chúng tôi theo dõi các báo cáo này bằng cách sử dụng các lệnh gọi ghi nhật ký.

Cách lưu nhật ký trong tệp

Mô-đun ghi nhật ký cho phép bạn theo dõi nhật ký của mình trong một tệp. Điều này rất hữu ích vì nó có nghĩa là bạn sẽ không mất nhật ký sau khi đóng trình bao Python của mình. Bạn sẽ có một hồ sơ vĩnh viễn về cách chương trình của bạn thực hiện vào một dịp cụ thể.

Tất cả những gì bạn cần làm là đưa đối số tên tệp vào dòng cấu hình trình xử lý ghi nhật ký và chương trình của bạn sẽ tự động lưu nhật ký vào một tệp:

import logging

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

…

Khi chúng tôi chạy mã của mình, nhật ký của chúng tôi sẽ được thêm vào tên tệp mà chúng tôi chỉ định. Nếu chúng tôi mở tệp “student_data.log”, thông tin sau sẽ được 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.

Lưu ý rằng đầu ra gỡ lỗi của chúng tôi chỉ chứa các thông báo mà chúng tôi đã chỉ định làm nhật ký bằng cách sử dụng logging.debug() phương pháp. Điều này rất hữu ích vì nó giúp chúng tôi phân biệt đầu ra chương trình - được biểu thị bằng print() câu lệnh - từ nhật ký gỡ lỗi.

Bạn cũng có thể thêm một tham số để theo dõi thời điểm một mục nhập đã được thêm vào nhật ký của bạn. Chúng tôi có thể làm như vậy bằng cách sử dụng mã sau:

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

Mã này thêm phần sau vào tệp student_data.log của chúng tôi:

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.

Bây giờ chúng ta biết khi nào mỗi dòng mã của chúng ta được thực thi. Trong một chương trình dài hơn, dữ liệu này sẽ đặc biệt hữu ích vì nó sẽ giúp chúng tôi hiểu thứ tự mã đang chạy và tốc độ mã của chúng tôi.

Kết luận

Mô-đun ghi nhật ký Python là một công cụ cực kỳ hữu ích để gỡ lỗi. Nó giúp bạn theo dõi tất cả các sự kiện chạy trong chương trình của mình và cung cấp cho bạn tùy chọn để lưu các sự kiện đó thành một tệp riêng biệt. Điều này sẽ giúp bạn gỡ lỗi mã hiệu quả hơn và hiểu những sự kiện nào đã thực thi khi bạn chạy một chương trình.