Trăn superset nghiêm ngặt
Ghi nhật ký là phương tiện theo dõi các sự kiện xảy ra khi một số phần mềm chạy. Nhà phát triển phần mềm thêm các cuộc gọi ghi nhật ký vào mã của họ để cho biết rằng một số sự kiện đã xảy ra. Một sự kiện được mô tả bằng một thông báo mô tả có thể tùy chọn chứa dữ liệu thay đổi (i. e. dữ liệu có khả năng khác nhau đối với mỗi lần xảy ra sự kiện). Các sự kiện cũng có một tầm quan trọng mà nhà phát triển gán cho sự kiện đó; Show
Khi nào nên sử dụng ghi nhật kýGhi nhật ký cung cấp một tập hợp các chức năng tiện lợi để sử dụng ghi nhật ký đơn giản. Đây là , , , và. Để xác định thời điểm sử dụng ghi nhật ký, hãy xem bảng bên dưới, trong đó nêu rõ công cụ tốt nhất để sử dụng cho từng nhóm nhiệm vụ chung đối với từng nhóm Nhiệm vụ bạn muốn thực hiện Công cụ tốt nhất cho nhiệm vụ Hiển thị đầu ra của bảng điều khiển để sử dụng thông thường tập lệnh hoặc chương trình dòng lệnh Báo cáo các sự kiện xảy ra trong quá trình hoạt động bình thường của một chương trình (e. g. để giám sát trạng thái hoặc điều tra lỗi) (hoặc cho đầu ra rất chi tiết cho mục đích chẩn đoán) Đưa ra cảnh báo về một sự kiện thời gian chạy cụ thể trong mã thư viện nếu sự cố có thể tránh được và ứng dụng khách phải được sửa đổi để loại bỏ cảnh báo nếu ứng dụng khách không thể làm gì về tình huống này, nhưng sự kiện vẫn cần được ghi lại Báo cáo lỗi liên quan đến một sự kiện thời gian chạy cụ thể Tăng một ngoại lệ Báo cáo triệt tiêu lỗi mà không đưa ra ngoại lệ (e. g. trình xử lý lỗi trong quy trình máy chủ chạy dài) , hoặc khi thích hợp cho miền ứng dụng và lỗi cụ thể Các chức năng ghi nhật ký được đặt tên theo mức độ hoặc mức độ nghiêm trọng của các sự kiện mà chúng được sử dụng để theo dõi. Các mức tiêu chuẩn và khả năng áp dụng của chúng được mô tả dưới đây (theo thứ tự mức độ nghiêm trọng tăng dần) Cấp độ Khi nó được sử dụng --log=INFO4 Thông tin chi tiết, thường chỉ được quan tâm khi chẩn đoán sự cố --log=INFO5 Xác nhận rằng mọi thứ đang hoạt động như mong đợi --log=INFO6 Một dấu hiệu cho thấy một điều gì đó bất ngờ đã xảy ra, hoặc một số vấn đề trong tương lai gần (e. g. 'dung lượng ổ đĩa thấp'). Phần mềm vẫn hoạt động bình thường --log=INFO7 Do một 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 --log=INFO8 Một 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 Cấp độ mặc định là --log=INFO6, có nghĩa là chỉ các sự kiện từ cấp độ này trở lên mới được theo dõi, trừ khi gói ghi nhật ký được định cấu hình để thực hiện theo cách khác Các sự kiện được theo dõi có thể được xử lý theo nhiều cách khác nhau. Cách đơn giản nhất để xử lý các sự kiện được theo dõi là in chúng ra bàn điều khiển. Một cách phổ biến khác là ghi chúng vào một tệp đĩa Một ví dụ đơn giảnMột ví dụ rất đơn giản là import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything Nếu bạn nhập những dòng này vào một tập lệnh và chạy nó, bạn sẽ thấy WARNING:root:Watch out! in ra trên bảng điều khiển. Thông báo --log=INFO5 không xuất hiện vì mức mặc định là --log=INFO6. Thông báo được in bao gồm chỉ báo về cấp độ và mô tả về sự kiện được cung cấp trong cuộc gọi ghi nhật ký, tôi. e. 'Coi chừng. ’. Đừng lo lắng về phần 'root' bây giờ. nó sẽ được giải thích sau. Đầu ra thực tế có thể được định dạng khá linh hoạt nếu bạn cần điều đó; Đăng nhập vào một tập tinMột tình huống rất phổ biến là ghi lại các sự kiện ghi nhật ký trong một tệp, vì vậy hãy xem xét điều đó tiếp theo. Hãy chắc chắn thử cách sau trong trình thông dịch Python mới bắt đầu và không chỉ tiếp tục từ phiên được mô tả ở trên import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö') Đã thay đổi trong phiên bản 3. 9. Đối số mã hóa đã được thêm vào. Trong các phiên bản Python cũ hơn hoặc nếu không được chỉ định, mã hóa được sử dụng là giá trị mặc định được sử dụng bởi. Mặc dù không được hiển thị trong ví dụ trên, nhưng đối số lỗi giờ đây cũng có thể được chuyển, đối số này xác định cách xử lý lỗi mã hóa. Đối với các giá trị khả dụng và mặc định, hãy xem tài liệu về. Và bây giờ nếu chúng ta mở tệp và xem những gì chúng ta có, chúng ta sẽ tìm thấy các thông điệp tường trình DEBUG:root:This message should go to the log file INFO:root:So should this WARNING:root:And this, too ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö Ví dụ này cũng cho thấy cách bạn có thể đặt mức ghi nhật ký đóng vai trò là ngưỡng theo dõi. Trong trường hợp này, vì chúng tôi đặt ngưỡng thành --log=INFO4, nên tất cả thư đã được in Nếu bạn muốn đặt mức ghi nhật ký từ tùy chọn dòng lệnh, chẳng hạn như --log=INFO và bạn có giá trị của tham số được truyền cho getattr(logging, loglevel.upper())5 trong một số loglevel biến, bạn có thể sử dụng getattr(logging, loglevel.upper()) để lấy giá trị mà bạn sẽ chuyển đến thông qua đối số cấp độ. Bạn có thể muốn kiểm tra lỗi bất kỳ giá trị đầu vào nào của người dùng, có thể như trong ví dụ sau # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...) Cuộc gọi đến phải đến trước bất kỳ cuộc gọi nào đến , , v.v. Nếu không, các chức năng đó sẽ gọi cho bạn với các tùy chọn mặc định. Vì nó được dự định là một cơ sở cấu hình đơn giản một lần, nên chỉ cuộc gọi đầu tiên mới thực sự làm được bất kỳ điều gì. các cuộc gọi tiếp theo thực sự là không hoạt động Nếu bạn chạy tập lệnh trên nhiều lần, các thông báo từ các lần chạy liên tiếp sẽ được thêm vào tệp ví dụ. đăng nhập. Nếu bạn muốn mỗi lần chạy bắt đầu lại, không nhớ các thông báo từ các lần chạy trước đó, bạn có thể chỉ định đối số chế độ tệp bằng cách thay đổi lệnh gọi trong ví dụ trên thành logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG) Đầu ra sẽ giống như trước, nhưng tệp nhật ký không còn được thêm vào, vì vậy các thông báo từ các lần chạy trước đó sẽ bị mất Đăng nhập từ nhiều mô-đunNếu chương trình của bạn bao gồm nhiều mô-đun, đây là ví dụ về cách bạn có thể tổ chức đăng nhập vào chương trình đó # myapp.py import logging import mylib def main(): logging.basicConfig(filename='myapp.log', level=logging.INFO) logging.info('Started') mylib.do_something() logging.info('Finished') if __name__ == '__main__': main() # mylib.py import logging def do_something(): logging.info('Doing something') Nếu bạn chạy myapp. py, bạn sẽ thấy điều này trong ứng dụng của tôi. đăng nhập WARNING:root:Watch out!0 đó là hy vọng những gì bạn đang mong đợi để xem. Bạn có thể khái quát hóa điều này thành nhiều mô-đun, sử dụng mẫu trong mylib. py. Lưu ý rằng đối với mô hình sử dụng đơn giản này, bạn sẽ không biết, bằng cách xem tệp nhật ký, thông báo của bạn đến từ đâu trong ứng dụng của bạn, ngoài việc xem mô tả sự kiện. Nếu bạn muốn theo dõi vị trí thư của mình, bạn sẽ cần tham khảo tài liệu ngoài cấp độ hướng dẫn – xem Ghi nhật ký dữ liệu biếnĐể ghi dữ liệu biến, hãy sử dụng chuỗi định dạng cho thông báo mô tả sự kiện và nối thêm dữ liệu biến làm đối số. Ví dụ WARNING:root:Watch out!1 sẽ hiển thị WARNING:root:Watch out!2 Như bạn có thể thấy, việc hợp nhất dữ liệu biến đổi vào thông báo mô tả sự kiện sử dụng kiểu định dạng chuỗi % cũ. Cái này là để tương thích ngược. gói ghi nhật ký trước các tùy chọn định dạng mới hơn như và. Các tùy chọn định dạng mới hơn này được hỗ trợ nhưng việc khám phá chúng nằm ngoài phạm vi của hướng dẫn này. xem để biết thêm thông tin Thay đổi định dạng của tin nhắn được hiển thịĐể thay đổi định dạng được sử dụng để hiển thị tin nhắn, bạn cần chỉ định định dạng bạn muốn sử dụng WARNING:root:Watch out!3 cái nào sẽ in WARNING:root:Watch out!4 Lưu ý rằng 'gốc' xuất hiện trong các ví dụ trước đó đã biến mất. Để biết toàn bộ những thứ có thể xuất hiện trong chuỗi định dạng, bạn có thể tham khảo tài liệu về , nhưng để sử dụng đơn giản, bạn chỉ cần tên cấp độ (mức độ nghiêm trọng), thông báo (mô tả sự kiện, bao gồm dữ liệu biến) và có thể hiển thị khi . Nó được mô tả trong phần sau Hiển thị ngày/giờ trong tin nhắnĐể hiển thị ngày và giờ của một sự kiện, bạn sẽ đặt '%(asctime)s' trong chuỗi định dạng của mình WARNING:root:Watch out!5 nên in một cái gì đó như thế này WARNING:root:Watch out!6 Định dạng mặc định để hiển thị ngày/giờ (hiển thị ở trên) giống như ISO8601 hoặc RFC 3339. Nếu bạn cần kiểm soát nhiều hơn đối với định dạng ngày/giờ, hãy cung cấp đối số datefmt cho # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...)3, như trong ví dụ này WARNING:root:Watch out!7 mà sẽ hiển thị một cái gì đó như thế này WARNING:root:Watch out!8 Định dạng của đối số datefmt giống như được hỗ trợ bởi Bước tiếp theoĐiều đó kết thúc phần hướng dẫn cơ bản. Nó là đủ để giúp bạn thiết lập và chạy với ghi nhật ký. Còn rất nhiều điều nữa mà gói ghi nhật ký cung cấp, nhưng để tận dụng tốt nhất, bạn sẽ cần đầu tư thêm một chút thời gian để đọc các phần sau. Nếu bạn đã sẵn sàng, hãy lấy một ít đồ uống yêu thích của bạn và tiếp tục Nếu nhu cầu ghi nhật ký của bạn đơn giản, thì hãy sử dụng các ví dụ trên để kết hợp đăng nhập vào tập lệnh của riêng bạn và nếu bạn gặp sự cố hoặc không hiểu điều gì đó, vui lòng đăng câu hỏi lên trang tổng hợp. lang thang. nhóm Usenet python (có sẵn tại ) và bạn sẽ sớm nhận được trợ giúp Vẫn ở đây? . Sau đó, bạn có thể xem qua Hướng dẫn ghi nhật ký nâng caoThư viện ghi nhật ký sử dụng phương pháp mô-đun và cung cấp một số danh mục thành phần. trình ghi nhật ký, trình xử lý, bộ lọc và trình định dạng
Thông tin sự kiện nhật ký được truyền giữa các trình ghi nhật ký, trình xử lý, bộ lọc và trình định dạng trong một phiên bản Ghi nhật ký được thực hiện bằng cách gọi các phương thức trên các thể hiện của lớp (sau đây gọi là logger). Mỗi phiên bản có một tên và chúng được sắp xếp theo khái niệm trong một hệ thống phân cấp không gian tên bằng cách sử dụng các dấu chấm (dấu chấm) làm dấu phân cách. Ví dụ: trình ghi nhật ký có tên ‘scan’ là cha của trình ghi nhật ký ‘scan. văn bản', 'quét. html' và 'quét. pdf'. Tên trình ghi nhật ký có thể là bất kỳ thứ gì bạn muốn và cho biết khu vực của ứng dụng nơi bắt nguồn thông báo đã ghi Một quy ước tốt để sử dụng khi đặt tên cho trình ghi nhật ký là sử dụng trình ghi nhật ký cấp mô-đun, trong mỗi mô-đun sử dụng ghi nhật ký, được đặt tên như sau WARNING:root:Watch out!9 Điều này có nghĩa là các tên trình ghi nhật ký theo dõi hệ thống phân cấp gói/mô-đun và rõ ràng là các sự kiện được ghi lại chỉ từ tên trình ghi nhật ký bằng trực giác Gốc của hệ thống phân cấp của logger được gọi là logger gốc. Đó là bộ ghi được sử dụng bởi các hàm , , và , chỉ gọi phương thức cùng tên của bộ ghi gốc. Các hàm và phương thức có cùng chữ ký. Tên của trình ghi nhật ký gốc được in là 'root' trong đầu ra đã ghi Tất nhiên, có thể đăng nhập tin nhắn đến các đích khác nhau. Hỗ trợ được bao gồm trong gói để ghi thông báo nhật ký vào tệp, vị trí HTTP GET/POST, email qua SMTP, ổ cắm chung, hàng đợi hoặc cơ chế ghi nhật ký dành riêng cho hệ điều hành như nhật ký hệ thống hoặc nhật ký sự kiện Windows NT. Các điểm đến được phục vụ bởi các lớp xử lý. Bạn có thể tạo lớp đích nhật ký của riêng mình nếu bạn có các yêu cầu đặc biệt không được đáp ứng bởi bất kỳ lớp trình xử lý tích hợp nào Theo mặc định, không có điểm đến nào được đặt cho bất kỳ thông báo ghi nhật ký nào. Bạn có thể chỉ định đích (chẳng hạn như bảng điều khiển hoặc tệp) bằng cách sử dụng như trong các ví dụ hướng dẫn. Nếu bạn gọi các hàm , , , và , chúng sẽ kiểm tra xem có đích đến nào được đặt không; Định dạng mặc định được đặt cho thư là import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')0 Bạn có thể thay đổi điều này bằng cách chuyển một chuỗi định dạng với đối số từ khóa định dạng. Để biết tất cả các tùy chọn liên quan đến cách tạo chuỗi định dạng, hãy xem Quy trình ghi nhật kýLuồng thông tin sự kiện nhật ký trong bộ ghi nhật ký và trình xử lý được minh họa trong sơ đồ sau Người khai thác gỗcác đối tượng có một công việc ba lần. Đầu tiên, chúng hiển thị một số phương thức cho mã ứng dụng để ứng dụng có thể ghi lại thông báo khi chạy. Thứ hai, các đối tượng logger xác định thông báo nhật ký nào sẽ hoạt động dựa trên mức độ nghiêm trọng (cơ sở lọc mặc định) hoặc đối tượng lọc. Thứ ba, các đối tượng logger chuyển các thông điệp tường trình có liên quan tới tất cả các trình xử lý nhật ký quan tâm Các phương pháp được sử dụng rộng rãi nhất trên các đối tượng logger thuộc hai loại. cấu hình và gửi tin nhắn Đây là những phương pháp cấu hình phổ biến nhất
Bạn không cần phải luôn gọi các phương thức này trên mọi trình ghi nhật ký bạn tạo. Xem hai đoạn cuối trong phần này Với đối tượng logger được định cấu hình, các phương thức sau đây sẽ tạo thông báo tường trình
trả về một tham chiếu đến một phiên bản trình ghi với tên được chỉ định nếu nó được cung cấp hoặc WARNING:root:Watch out!02 nếu không. Tên là các cấu trúc phân cấp được phân tách bằng dấu chấm. Nhiều cuộc gọi đến có cùng tên sẽ trả về một tham chiếu đến cùng một đối tượng logger. Trình ghi nhật ký nằm sâu hơn trong danh sách phân cấp là con của trình ghi nhật ký cao hơn trong danh sách. Ví dụ: cho một người khai thác gỗ có tên là WARNING:root:Watch out!04, những người khai thác gỗ có tên là WARNING:root:Watch out!05, WARNING:root:Watch out!06 và WARNING:root:Watch out!07 đều là hậu duệ của WARNING:root:Watch out!04 Loggers có một khái niệm về mức độ hiệu quả. Nếu một mức không được đặt rõ ràng trên bộ ghi nhật ký, thì mức gốc của nó sẽ được sử dụng làm mức hiệu quả của nó. Nếu cấp độ gốc không được đặt mức rõ ràng, thì cấp độ gốc của nó sẽ được kiểm tra, v.v. - tất cả tổ tiên được tìm kiếm cho đến khi tìm thấy cấp độ được đặt rõ ràng. Bộ ghi gốc luôn có một mức rõ ràng được thiết lập (_______0_______6 theo mặc định). Khi quyết định có xử lý một sự kiện hay không, mức độ hiệu quả của bộ ghi được sử dụng để xác định xem sự kiện có được chuyển đến trình xử lý của bộ ghi hay không Trình ghi nhật ký con truyền thông điệp tới trình xử lý được liên kết với trình ghi nhật ký tổ tiên của chúng. Do đó, không cần thiết phải xác định và định cấu hình trình xử lý cho tất cả các trình ghi nhật ký mà ứng dụng sử dụng. Chỉ cần định cấu hình trình xử lý cho trình ghi nhật ký cấp cao nhất và tạo trình ghi nhật ký con khi cần. (Tuy nhiên, bạn có thể tắt tính năng lan truyền bằng cách đặt thuộc tính lan truyền của bộ ghi nhật ký thành WARNING:root:Watch out!10. ) xử lýcác đối tượng chịu trách nhiệm gửi các thông điệp tường trình thích hợp (dựa trên mức độ nghiêm trọng của thông điệp tường trình) đến đích được chỉ định của trình xử lý. các đối tượng có thể thêm 0 hoặc nhiều đối tượng xử lý vào chính chúng bằng một phương thức. Như một tình huống ví dụ, một ứng dụng có thể muốn gửi tất cả các thông báo tường trình đến một tệp nhật ký, tất cả các thông báo tường trình có lỗi hoặc cao hơn đến thiết bị xuất chuẩn và tất cả các thông báo quan trọng đến một địa chỉ email. Kịch bản này yêu cầu ba trình xử lý riêng lẻ trong đó mỗi trình xử lý chịu trách nhiệm gửi tin nhắn có mức độ nghiêm trọng cụ thể đến một vị trí cụ thể Thư viện tiêu chuẩn bao gồm khá nhiều loại trình xử lý (xem ); Có rất ít phương thức trong trình xử lý để các nhà phát triển ứng dụng quan tâm đến. Các phương thức xử lý duy nhất có vẻ phù hợp với các nhà phát triển ứng dụng đang sử dụng các đối tượng trình xử lý tích hợp (nghĩa là không tạo các trình xử lý tùy chỉnh) là các phương thức cấu hình sau
Mã ứng dụng không nên khởi tạo trực tiếp và sử dụng các phiên bản của. Thay vào đó, lớp này là một lớp cơ sở xác định giao diện mà tất cả các trình xử lý nên có và thiết lập một số hành vi mặc định mà các lớp con có thể sử dụng (hoặc ghi đè) Trình định dạngCác đối tượng trình định dạng định cấu hình thứ tự, cấu trúc và nội dung cuối cùng của thông báo tường trình. Không giống như lớp cơ sở, mã ứng dụng có thể khởi tạo các lớp trình định dạng, mặc dù bạn có thể phân lớp trình định dạng nếu ứng dụng của bạn cần hành vi đặc biệt. Hàm tạo có ba đối số tùy chọn - chuỗi định dạng thông báo, chuỗi định dạng ngày và chỉ báo kiểu ghi nhật ký. trình định dạng. __init__(fmt=Không có, datefmt=None, style='%')Nếu không có chuỗi định dạng tin nhắn, mặc định là sử dụng tin nhắn thô. Nếu không có chuỗi định dạng ngày, định dạng ngày mặc định là import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')1 với mili giây được xử lý ở cuối. WARNING:root:Watch out!24 là một trong số WARNING:root:Watch out!25, WARNING:root:Watch out!26 hoặc WARNING:root:Watch out!27. Nếu một trong những điều này không được chỉ định, thì WARNING:root:Watch out!25 sẽ được sử dụng Nếu WARNING:root:Watch out!24 là WARNING:root:Watch out!25, thì chuỗi định dạng thông báo sử dụng thay thế chuỗi theo kiểu WARNING:root:Watch out!31; . Nếu kiểu là WARNING:root:Watch out!26, thì chuỗi định dạng thông báo được coi là tương thích với (sử dụng các đối số từ khóa), trong khi nếu kiểu là WARNING:root:Watch out!27 thì chuỗi định dạng thông báo phải phù hợp với những gì được mong đợi bởi Đã thay đổi trong phiên bản 3. 2. Đã thêm tham số WARNING:root:Watch out!24. Chuỗi định dạng thông báo sau đây sẽ ghi lại thời gian ở định dạng mà con người có thể đọc được, mức độ nghiêm trọng của thông báo và nội dung của thông báo theo thứ tự đó import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')2 Trình định dạng sử dụng chức năng do người dùng định cấu hình để chuyển đổi thời gian tạo bản ghi thành bộ dữ liệu. Theo mặc định, được sử dụng; . Để thay đổi nó cho tất cả các trình định dạng, ví dụ: nếu bạn muốn tất cả thời gian ghi nhật ký được hiển thị theo giờ GMT, hãy đặt thuộc tính WARNING:root:Watch out!38 trong lớp Trình định dạng (thành WARNING:root:Watch out!42 để hiển thị theo giờ GMT) Định cấu hình ghi nhật kýCác lập trình viên có thể định cấu hình ghi nhật ký theo ba cách
Để biết tài liệu tham khảo về hai tùy chọn cuối cùng, hãy xem. Ví dụ sau định cấu hình trình ghi nhật ký rất đơn giản, trình xử lý bảng điều khiển và trình định dạng đơn giản bằng mã Python import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')3 Chạy mô-đun này từ dòng lệnh sẽ tạo ra đầu ra sau import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')4 Mô-đun Python sau đây tạo một trình ghi nhật ký, trình xử lý và trình định dạng gần giống với các mô-đun trong ví dụ được liệt kê ở trên, với sự khác biệt duy nhất là tên của các đối tượng import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')5 Đây là nhật ký. tập tin conf import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')6 Đầu ra gần giống với đầu ra của ví dụ không dựa trên tệp cấu hình import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')7 Bạn có thể thấy rằng cách tiếp cận tệp cấu hình có một vài ưu điểm so với cách tiếp cận mã Python, chủ yếu là tách cấu hình và mã và khả năng của những người không mã hóa dễ dàng sửa đổi các thuộc tính ghi nhật ký Cảnh báo Hàm lấy một tham số mặc định, WARNING:root:Watch out!46, mặc định là WARNING:root:Watch out!47 vì lý do tương thích ngược. Điều này có thể hoặc không thể là những gì bạn muốn, vì nó sẽ khiến bất kỳ trình ghi nhật ký không phải root nào tồn tại trước lệnh gọi bị vô hiệu hóa trừ khi chúng (hoặc tổ tiên) được đặt tên rõ ràng trong cấu hình. Vui lòng tham khảo tài liệu tham khảo để biết thêm thông tin và chỉ định WARNING:root:Watch out!10 cho thông số này nếu bạn muốn Từ điển được chuyển đến cũng có thể chỉ định một giá trị Boolean với khóa WARNING:root:Watch out!46, giá trị này nếu không được chỉ định rõ ràng trong từ điển cũng được hiểu theo mặc định là WARNING:root:Watch out!47. Điều này dẫn đến hành vi vô hiệu hóa trình ghi nhật ký được mô tả ở trên, đây có thể không phải là điều bạn muốn - trong trường hợp đó, hãy cung cấp khóa một cách rõ ràng với giá trị là WARNING:root:Watch out!10 Lưu ý rằng tên lớp được tham chiếu trong tệp cấu hình cần phải liên quan đến mô-đun ghi nhật ký hoặc giá trị tuyệt đối có thể được giải quyết bằng cơ chế nhập thông thường. Do đó, bạn có thể sử dụng (liên quan đến mô-đun ghi nhật ký) hoặc WARNING:root:Watch out!55 (đối với lớp được xác định trong gói WARNING:root:Watch out!56 và mô-đun WARNING:root:Watch out!57, trong đó ________56 có sẵn trên đường dẫn nhập Python) Trong Trăn 3. 2, một phương tiện mới để định cấu hình ghi nhật ký đã được giới thiệu, sử dụng từ điển để lưu giữ thông tin cấu hình. Điều này cung cấp một siêu chức năng của phương pháp tiếp cận dựa trên tệp cấu hình được nêu ở trên và là phương pháp cấu hình được đề xuất cho các ứng dụng và triển khai mới. Vì từ điển Python được sử dụng để chứa thông tin cấu hình và vì bạn có thể điền từ điển đó bằng các phương tiện khác nhau nên bạn có nhiều tùy chọn hơn cho cấu hình. Ví dụ: bạn có thể sử dụng tệp cấu hình ở định dạng JSON hoặc, nếu bạn có quyền truy cập vào chức năng xử lý YAML, tệp ở định dạng YAML, để điền vào từ điển cấu hình. Hoặc, tất nhiên, bạn có thể xây dựng từ điển bằng mã Python, nhận nó ở dạng ngâm qua ổ cắm hoặc sử dụng bất kỳ cách tiếp cận nào phù hợp với ứng dụng của bạn Đây là một ví dụ về cấu hình tương tự như trên, ở định dạng YAML cho cách tiếp cận dựa trên từ điển mới import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')8 Để biết thêm thông tin về ghi nhật ký bằng từ điển, hãy xem Điều gì xảy ra nếu không có cấu hình nào được cung cấpNếu không cung cấp cấu hình ghi nhật ký, có thể xảy ra tình huống cần xuất sự kiện ghi nhật ký, nhưng không tìm thấy trình xử lý nào để xuất sự kiện. Hành vi của gói ghi nhật ký trong những trường hợp này phụ thuộc vào phiên bản Python Đối với các phiên bản Python trước 3. 2, hành vi như sau
Trong Trăn 3. 2 trở lên, hành vi như sau
Để có được pre-3. 2 hành vi, WARNING:root:Watch out!61 có thể được đặt thành WARNING:root:Watch out!66 Định cấu hình ghi nhật ký cho thư việnKhi phát triển một thư viện sử dụng ghi nhật ký, bạn nên cẩn thận ghi lại cách thư viện sử dụng ghi nhật ký - ví dụ: tên của các trình ghi nhật ký được sử dụng. Một số cân nhắc cũng cần được đưa ra cho cấu hình ghi nhật ký của nó. Nếu ứng dụng đang sử dụng không sử dụng tính năng ghi nhật ký và mã thư viện thực hiện lệnh gọi ghi nhật ký, thì (như được mô tả trong phần trước) các sự kiện có mức độ nghiêm trọng --log=INFO6 trở lên sẽ được in tới logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)8. Đây được coi là hành vi mặc định tốt nhất Nếu vì lý do nào đó mà bạn không muốn những thông báo này được in khi không có bất kỳ cấu hình ghi nhật ký nào, thì bạn có thể đính kèm một trình xử lý không cần làm gì vào trình ghi nhật ký cấp cao nhất cho thư viện của mình. Điều này tránh cho thông báo được in, vì sẽ luôn tìm thấy một trình xử lý cho các sự kiện của thư viện. nó chỉ không tạo ra bất kỳ đầu ra nào. Nếu người dùng thư viện định cấu hình ghi nhật ký để sử dụng ứng dụng, có lẽ cấu hình đó sẽ thêm một số trình xử lý và nếu các mức được định cấu hình phù hợp thì các cuộc gọi ghi nhật ký được thực hiện trong mã thư viện sẽ gửi đầu ra tới các trình xử lý đó, như bình thường Trình xử lý không làm gì được bao gồm trong gói ghi nhật ký. (kể từ Python 3. 1). Phiên bản của trình xử lý này có thể được thêm vào trình ghi nhật ký cấp cao nhất của không gian tên ghi nhật ký được sử dụng bởi thư viện (nếu bạn muốn ngăn không cho các sự kiện đã ghi trong thư viện của mình xuất ra thành logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)8 khi không có cấu hình ghi nhật ký). Nếu tất cả việc ghi nhật ký của thư viện foo được thực hiện bằng cách sử dụng các trình ghi nhật ký có tên khớp với 'foo. x', 'foo. x. y’, v.v. sau đó mã import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')9 nên có hiệu quả mong muốn. Nếu một tổ chức tạo ra một số thư viện, thì tên logger được chỉ định có thể là 'tên tổ chức'. foo' thay vì chỉ 'foo' Ghi chú Chúng tôi đặc biệt khuyên bạn không nên đăng nhập vào trình ghi nhật ký gốc trong thư viện của mình. Thay vào đó, hãy sử dụng trình ghi nhật ký có tên duy nhất và dễ nhận biết, chẳng hạn như WARNING:root:Watch out!71 cho gói hoặc mô-đun cấp cao nhất của thư viện của bạn. Việc ghi nhật ký vào bộ ghi gốc sẽ gây khó khăn hoặc không thể cho nhà phát triển ứng dụng định cấu hình mức độ chi tiết của bản ghi hoặc trình xử lý thư viện của bạn như họ muốn Ghi chú Chúng tôi đặc biệt khuyên bạn không nên thêm bất kỳ trình xử lý nào ngoài trình ghi nhật ký của thư viện. Điều này là do cấu hình của trình xử lý là đặc quyền của nhà phát triển ứng dụng sử dụng thư viện của bạn. Nhà phát triển ứng dụng biết đối tượng mục tiêu của họ và trình xử lý nào phù hợp nhất cho ứng dụng của họ. nếu bạn thêm trình xử lý 'dưới mui xe', bạn cũng có thể can thiệp vào khả năng thực hiện kiểm tra đơn vị và cung cấp nhật ký phù hợp với yêu cầu của họ Cấp độ ghi nhật kýCác giá trị số của các mức ghi nhật ký được đưa ra trong bảng sau. Đây chủ yếu là mối quan tâm nếu bạn muốn xác định cấp độ của riêng mình và cần chúng có giá trị cụ thể so với cấp độ được xác định trước. Nếu bạn xác định một mức có cùng giá trị số, thì mức đó sẽ ghi đè lên giá trị đã xác định trước; Cấp độ Giá trị số --log=INFO8 50 --log=INFO7 40 --log=INFO6 30 --log=INFO5 20 --log=INFO4 10 WARNING:root:Watch out!78 0 Các cấp độ cũng có thể được liên kết với trình ghi nhật ký, do nhà phát triển đặt hoặc thông qua tải cấu hình ghi nhật ký đã lưu. Khi một phương thức ghi nhật ký được gọi trên bộ ghi nhật ký, bộ ghi sẽ so sánh cấp độ của chính nó với cấp độ được liên kết với lệnh gọi phương thức. Nếu mức của trình ghi nhật ký cao hơn mức của lệnh gọi phương thức, thì không có thông báo ghi nhật ký nào thực sự được tạo. Đây là cơ chế cơ bản kiểm soát mức độ chi tiết của đầu ra ghi nhật ký Thông điệp ghi nhật ký được mã hóa dưới dạng các thể hiện của lớp. Khi một trình ghi nhật ký quyết định thực sự ghi nhật ký một sự kiện, một phiên bản được tạo từ thông báo ghi nhật ký Các thông báo ghi nhật ký phải tuân theo cơ chế gửi đi thông qua việc sử dụng các trình xử lý, là các thể hiện của các lớp con của lớp. Trình xử lý chịu trách nhiệm đảm bảo rằng một thông báo đã ghi (ở dạng ) kết thúc ở một vị trí cụ thể (hoặc tập hợp các vị trí) hữu ích cho đối tượng mục tiêu của thông báo đó (chẳng hạn như người dùng cuối, nhân viên bộ phận hỗ trợ, quản trị viên hệ thống . Trình xử lý được thông qua các phiên bản dành cho các đích cụ thể. Mỗi logger có thể không có, một hoặc nhiều trình xử lý được liên kết với nó (thông qua phương thức ). Ngoài bất kỳ trình xử lý nào được liên kết trực tiếp với trình ghi nhật ký, tất cả trình xử lý được liên kết với tất cả tổ tiên của trình ghi nhật ký đều được gọi để gửi thông báo (trừ khi cờ truyền cho trình ghi nhật ký được đặt thành giá trị sai, tại thời điểm đó, quá trình chuyển đến trình xử lý tổ tiên dừng lại Cũng giống như đối với bộ ghi nhật ký, trình xử lý có thể có các cấp độ được liên kết với chúng. Cấp độ của trình xử lý hoạt động như một bộ lọc giống như cấp độ của trình ghi nhật ký. Nếu một trình xử lý quyết định thực sự gửi một sự kiện, thì phương thức này được sử dụng để gửi tin nhắn đến đích của nó. Hầu hết các lớp con do người dùng định nghĩa sẽ cần ghi đè lớp này Cấp độ tùy chỉnhCó thể xác định cấp độ của riêng bạn, nhưng không cần thiết, vì các cấp độ hiện có đã được chọn trên cơ sở kinh nghiệm thực tế. Tuy nhiên, nếu bạn tin rằng bạn cần các mức tùy chỉnh, thì bạn nên hết sức cẩn thận khi thực hiện việc này và có thể là một ý tưởng rất tồi nếu xác định các mức tùy chỉnh nếu bạn đang phát triển một thư viện. Đó là bởi vì nếu nhiều tác giả thư viện đều xác định các mức tùy chỉnh của riêng họ, thì có khả năng đầu ra ghi nhật ký từ nhiều thư viện được sử dụng cùng nhau sẽ gây khó khăn cho nhà phát triển sử dụng để kiểm soát và/hoặc diễn giải, bởi vì một giá trị số nhất định có thể có ý nghĩa khác nhau Trình xử lý hữu íchNgoài lớp cơ sở, nhiều lớp con hữu ích được cung cấp
Mới trong phiên bản 3. 1. Lớp học. Mới trong phiên bản 3. 2. Lớp học. Các lớp , và được định nghĩa trong gói ghi nhật ký cốt lõi. Các trình xử lý khác được xác định trong một mô-đun phụ,. (Ngoài ra còn có một mô-đun phụ khác, dành cho chức năng cấu hình. ) Thông báo đã ghi được định dạng để trình bày thông qua các phiên bản của lớp. Chúng được khởi tạo với một chuỗi định dạng phù hợp để sử dụng với toán tử % và từ điển Để định dạng nhiều thư trong một lô, có thể sử dụng các trường hợp của import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')19. Ngoài chuỗi định dạng (được áp dụng cho từng thư trong lô), còn có cung cấp cho chuỗi định dạng tiêu đề và đuôi Khi lọc dựa trên cấp độ bộ ghi và/hoặc cấp độ trình xử lý là không đủ, các phiên bản của có thể được thêm vào cả hai phiên bản và (thông qua phương thức của chúng). Trước khi quyết định xử lý thêm một thông báo, cả người ghi nhật ký và người xử lý đều tham khảo tất cả các bộ lọc của họ để được cấp phép. Nếu bất kỳ bộ lọc nào trả về giá trị sai, thông báo sẽ không được xử lý thêm Chức năng cơ bản cho phép lọc theo tên logger cụ thể. Nếu tính năng này được sử dụng, các tin nhắn được gửi tới bộ ghi nhật ký có tên và các phần tử con của nó sẽ được cho phép thông qua bộ lọc và tất cả các bộ ghi khác sẽ bị loại bỏ Các ngoại lệ được nêu ra trong quá trình ghi nhật kýGói ghi nhật ký được thiết kế để nuốt các ngoại lệ xảy ra khi đăng nhập vào sản xuất. Điều này là để các lỗi xảy ra trong khi xử lý các sự kiện ghi nhật ký - chẳng hạn như cấu hình sai ghi nhật ký, lỗi mạng hoặc các lỗi tương tự khác - không khiến ứng dụng sử dụng tính năng ghi nhật ký kết thúc sớm và ngoại lệ không bao giờ được nuốt. Các ngoại lệ khác xảy ra trong phương thức của một lớp con được truyền cho phương thức của nó Việc triển khai mặc định trong kiểm tra xem biến cấp mô-đun, import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')32, có được đặt hay không. Nếu được đặt, một dấu vết được in thành. Nếu không được đặt, ngoại lệ sẽ bị nuốt Ghi chú Giá trị mặc định của import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')32 là WARNING:root:Watch out!47. Điều này là do trong quá trình phát triển, bạn thường muốn được thông báo về bất kỳ trường hợp ngoại lệ nào xảy ra. Bạn nên đặt import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')32 thành WARNING:root:Watch out!10 để sử dụng trong sản xuất Sử dụng các đối tượng tùy ý làm tin nhắnTrong các phần và ví dụ trước, người ta đã giả định rằng thông báo được truyền khi ghi nhật ký sự kiện là một chuỗi. Tuy nhiên, đây không phải là khả năng duy nhất. Bạn có thể truyền một đối tượng tùy ý dưới dạng một thông báo và phương thức của nó sẽ được gọi khi hệ thống ghi nhật ký cần chuyển đổi nó thành biểu diễn chuỗi. Trên thực tế, nếu muốn, bạn có thể tránh hoàn toàn việc tính toán một biểu diễn chuỗi - ví dụ: phát ra một sự kiện bằng cách chọn nó và gửi nó qua dây Tối ưu hóaĐịnh dạng của các đối số thông báo được hoãn lại cho đến khi không thể tránh được. Tuy nhiên, việc tính toán các đối số được truyền cho phương thức ghi nhật ký cũng có thể tốn kém và bạn có thể muốn tránh thực hiện việc này nếu trình ghi nhật ký sẽ loại bỏ sự kiện của bạn. Để quyết định phải làm gì, bạn có thể gọi phương thức lấy đối số mức và trả về giá trị true nếu sự kiện sẽ được Trình ghi nhật ký tạo cho mức gọi đó. Bạn có thể viết mã như thế này DEBUG:root:This message should go to the log file INFO:root:So should this WARNING:root:And this, too ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö0 để nếu ngưỡng của bộ ghi được đặt trên --log=INFO4, thì các cuộc gọi đến import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')42 và import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')43 sẽ không bao giờ được thực hiện Ghi chú Trong một số trường hợp, bản thân nó có thể đắt hơn bạn muốn (e. g. đối với các bộ ghi được lồng sâu trong đó mức rõ ràng chỉ được thiết lập ở mức cao trong hệ thống phân cấp của bộ ghi). Trong những trường hợp như vậy (hoặc nếu bạn muốn tránh gọi một phương thức trong các vòng lặp chặt chẽ), bạn có thể lưu trữ kết quả của một lệnh gọi vào một biến cục bộ hoặc biến thể hiện và sử dụng phương thức đó thay vì gọi phương thức mỗi lần. Một giá trị được lưu trong bộ nhớ cache như vậy sẽ chỉ cần được tính toán lại khi cấu hình ghi nhật ký thay đổi linh hoạt trong khi ứng dụng đang chạy (điều này không phổ biến lắm) Có các tối ưu hóa khác có thể được thực hiện cho các ứng dụng cụ thể cần kiểm soát chính xác hơn đối với thông tin nhật ký nào được thu thập. Dưới đây là danh sách những việc bạn có thể làm để tránh xử lý trong quá trình ghi nhật ký mà bạn không cần Những gì bạn không muốn thu thập Làm thế nào để tránh thu thập nó Thông tin về nơi các cuộc gọi được thực hiện từ Đặt import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')46 thành WARNING:root:Watch out!66. Điều này tránh gọi , điều này có thể giúp tăng tốc mã của bạn trong các môi trường như PyPy (không thể tăng tốc mã sử dụng ) thông tin luồng Đặt import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')50 thành WARNING:root:Watch out!10 ID quy trình hiện tại () Đặt import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')53 thành WARNING:root:Watch out!10 Tên quy trình hiện tại khi sử dụng import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')09 để quản lý nhiều quy trình Đặt import logging logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') logging.error('And non-ASCII stuff, too, like Øresund and Malmö')56 thành WARNING:root:Watch out!10 Cũng lưu ý rằng mô-đun ghi nhật ký lõi chỉ bao gồm các trình xử lý cơ bản. Nếu bạn không nhập và , chúng sẽ không chiếm bất kỳ bộ nhớ nào |