Mô-đun đăng nhập python

Các ứng dụng chạy trong sản phẩm mất khả năng xuất hiện cho chúng tôi biết trực tiếp những gì đang diễn ra dưới mui xe, chúng trở nên giống như hộp đen và vì vậy chúng tôi cần một cách để theo dõi và . Ghi nhật ký là cách tiếp cận đơn giản và đơn giản nhất để làm như vậy. Chúng tôi hướng dẫn chương trình trong quá trình phát triển để phát thông tin trong khi chạy sẽ hữu ích cho việc giải quyết sự cố trong tương lai hoặc đơn giản là để phân tích. Khi nói đến Python, mô-đun tích hợp để ghi nhật ký được thiết kế để phù hợp với các ứng dụng có thiết lập tối thiểu. Cho dù bạn đã thành công trong việc đăng nhập vào Python hay bạn bắt đầu phát triển với nó, mục đích của bài viết này là toàn diện nhất có thể và đi sâu vào các phương pháp để tận dụng các tiềm năng khai thác. bài báo. Trong phần thứ hai, chúng tôi sẽ tiếp cận các dịch vụ AWS và sử dụng kết hợp dịch vụ AWS Kinesis Data Firehose và AWS Elaticsearch để cung cấp một cách để hiển thị và xóa ký tự lỗi nhật ký trên bảng điều khiển Kibana cũng như lưu trữ . mất khả năng cho chúng tôi biết trực tiếp những gì đang diễn ra bên dưới mui xe, chúng trở nên giống như hộp đen và vì vậy chúng tôi cần một cách để theo dõi và giám sát hành vi của chúng. Ghi nhật ký cho đến nay là cách tiếp cận đơn giản và dễ hiểu nhất để làm như vậy. Chúng tôi hướng dẫn chương trình trong quá trình phát triển phát ra thông tin trong khi chạy sẽ hữu ích cho việc khắc phục sự cố trong tương lai hoặc đơn giản là để phân tích. Khi nói đến Python, mô-đun tích hợp để ghi nhật ký được thiết kế để phù hợp với các ứng dụng với thiết lập tối thiểu. Cho dù bạn đã thành thạo ghi nhật ký bằng Python hay bạn đang bắt đầu phát triển với nó, mục đích của bài viết này là toàn diện nhất có thể và đi sâu vào các phương pháp để tận dụng tiềm năng ghi nhật ký. Lưu ý rằng đây là một bài viết gồm hai phần. Trong phần thứ hai, chúng ta sẽ tiếp cận các dịch vụ AWS và sử dụng kết hợp AWS Kinesis Data Firehose và AWS ElasticSearch Service để cung cấp cách hiển thị và gỡ lỗi nhật ký trên Kibana Dashboard cũng như lưu trữ chúng vào S3 để có sẵn các bản sao lâu dài

Nội dung chính Hiển thị

  • Những điều cơ bản về mô-đun đăng nhập Python
  • basicConfig[]
  • Một ví dụ về basicconfig[]
  • Thực hành tốt nhất. Một bộ ghi có thể hiển thị cho mỗi mô-đun
  • Use fileconfig[] và dictconfig[]
  • fileConfig[]
  • dictConfig[]
  • Định dạng nhật ký theo cách JSON
  • Thêm thông tin theo ngữ cảnh vào nhật ký của bạn
  • Xử lý ngoại lệ Python và truy nguyên
  • Nắm bắt các ngoại lệ chưa được xử lý

Những điều cơ bản về mô-đun đăng nhập Python

Trước khi bắt đầu hành trình của chúng tôi, hãy để Lôi tự hỏi mình một câu hỏi đơn giản. Logger là gì? . Họ là công cụ mà tôi sử dụng để nói với hệ thống những gì cần đăng nhập và cách thực hiện. máy ghi nhật ký là gì? . Chúng là công cụ chúng tôi sử dụng để báo cho hệ thống biết cần ghi nhật ký gì và thực hiện như thế nào. Với một phiên bản của trình ghi nhật ký chung, chúng tôi có thể gửi thư đến bất cứ nơi nào chúng tôi muốn mà không phải lo lắng về việc triển khai chưa hoàn thiện. Ví dụ: khi chúng ta viết

logger.info["Logging a variable %s", variable1]

Chúng tôi đang mô tả sự việc sau. Tiêu chuẩn thư viện của Python đi kèm với mô-đun đăng nhập mô-đun mà bạn có thể bắt đầu sử dụng mà không cần cài đặt bất kỳ điều gì. Trong việc tuân thủ các thành phần tốt nhất yêu cầu tránh chỉ vào bảng điều khiển bạn muốn báo cáo, mô-đun đăng nhập của Python cung cấp nhiều thuận lợi

Thư viện chuẩn của Python đi kèm với mô-đun ghi nhật ký mà bạn có thể bắt đầu sử dụng mà không cần cài đặt bất kỳ thứ gì. Để tuân thủ các phương pháp hay nhất yêu cầu tránh chỉ cần in vào bảng điều khiển bất cứ điều gì bạn muốn báo cáo, mô-đun ghi nhật ký của Python cung cấp nhiều lợi thế
  • Hỗ trợ cho đa luồng;
  • Nhật ký ghi nhật ký;
  • linh hoạt hơn;
  • sự phân tách giữa dữ liệu và định dạng

Chúng tôi tận dụng tiềm năng của công việc ghi nhật ký bằng cách tách những gì được viết lại với cách nó được thực hiện. Khi xem xét cách thức của người Viking, chúng ta nên chăm sóc ba khía cạnh chính

  1. Cấp độ. Mức độ ưu tiên tối thiểu tối thiểu của tin nhắn để ghi nhật ký. Để tăng mức độ quan trọng, các ký hiệu có sẵn là. gỡ lỗi, thông tin, cảnh báo, lỗi và quan trọng. Theo mặc định, cấp độ được đặt thành cảnh báo, có nghĩa là mô-đun ghi nhật ký Python sẽ lọc bất kỳ thông báo xóa lỗi hoặc thông tin nào. . mức độ ưu tiên tối thiểu của tin nhắn để đăng nhập. Theo thứ tự tăng dần mức độ nghiêm trọng, các cấp nhật ký có sẵn là. GỠ LỖI, THÔNG TIN, CẢNH BÁO, LỖI và TUYỆT VỜI. Theo mặc định, mức được đặt thành CẢNH BÁO, nghĩa là mô-đun ghi nhật ký của Python sẽ lọc ra mọi thông báo GỠ LỖI hoặc THÔNG TIN.
  2. Trình xử lý. Xác định nơi đăng ký của bạn sẽ được đưa vào. Ngoại trừ khi được định nghĩa, thư viện nhật ký sẽ sử dụng StreamHandler để gửi tin nhắn đến sys. stderr hoặc, chỉ cần nói, bảng điều khiển. Nó cũng xử lý định dạng. . xác định nơi nhật ký của bạn sẽ được đưa vào. Trừ khi được chỉ định, thư viện ghi nhật ký sẽ sử dụng StreamHandler để gửi thông báo tới sys. stderr hay nói một cách đơn giản là console. Nó cũng xử lý định dạng.
  3. Định dạng. Theo mặc định, thư viện nhật ký sẽ ghi nhật ký tin nhắn ở định dạng sau. . Tất nhiên, có khả năng tùy chỉnh giao diện của các dòng nhật ký của bạn thêm thông tin tùy chỉnh tùy chỉnh, chúng tôi sẽ kiểm tra điều đó sau. . theo mặc định, thư viện ghi nhật ký sẽ ghi các thông báo ở định dạng sau. Tất nhiên, có khả năng tùy chỉnh giao diện của các dòng nhật ký của bạn bằng cách thêm thông tin tùy chỉnh, chúng tôi sẽ đề cập đến điều đó sau.

Mô-đun ghi nhật ký Python cung cấp cho bạn các cách khác nhau để tạo các ký tự nhật ký phù hợp với nhu cầu cụ thể của bạn, kết hợp trình xử lý, định dạng và cấp độ. Please start with the method config logger đơn giản nhất. cung cấp cho bạn các cách khác nhau để tạo trình ghi nhật ký phù hợp với nhu cầu cụ thể của bạn, kết hợp trình xử lý, định dạng và cấp độ. Hãy bắt đầu với phương pháp cấu hình nhật ký đơn giản nhất.

basicConfig[]

basicConfig[]

Bằng cách sử dụng phương thức basicConfig[], bạn có thể nhanh chóng định cấu hình hành động theo mong muốn của bộ ghi gốc của bạn. Các cách tiếp cận có thể quản lý khác nhau cho các dự án lớn hơn bao gồm sử dụng cấu hình ghi nhật ký dựa trên tệp hoặc từ điển thay thế. Không có gì, BasicConfig [] là một cách ưa thích để bắt đầu mô tả cách tiếp cận tốt hơn với ký nhật ký mô-đun của bạn. rằng trong một số vấn đề nhất định, bạn có thể thiếu khả năng hiển thị khi truy tìm lỗi hoặc nói chung khi tiến hành phân tích nguyên nhân. Theo tiêu chuẩn của nó, mô-đun ghi nhật ký, như chúng tôi đã nói trước đây, gửi nhật ký trực tiếp đến bảng điều khiển, nhưng các tùy chọn khả năng điều khiển khác, và cũng được xuất ra, đang sử dụng StreamHandler hoặc . Ngay cả khi đăng nhập vào tệp, ưu điểm của nó là tránh các lỗi liên quan đến mạng tiềm ẩn và dễ dàng thiết lập, trong những ngày này và thời đại, nơi các ứng dụng được phân phối trên mạng và tỷ lệ nhanh . Thay vào đó, cách tiếp tục này có thể được coi là một cách thiết thực để sao lưu các tệp bài hát nhật ký với việc có thể tập trung và theo dõi chúng qua mục tiêu mạng. basicConfig[] bạn có thể nhanh chóng định cấu hình hành vi mong muốn của bộ ghi gốc của mình. Các cách tiếp cận có thể quản lý khác cho các dự án lớn hơn bao gồm sử dụng cấu hình ghi nhật ký dựa trên tệp hoặc dựa trên từ điển thay thế. Tuy nhiên, basicConfig[] là cách ưu tiên để bắt đầu mô tả cách tiếp cận việc ghi nhật ký của bạn tốt hơn. Mô-đun ghi nhật ký có CẢNH BÁO làm cấp độ ghi nhật ký mặc định, điều đó có nghĩa là trong một số trường hợp nhất định, bạn có thể thiếu khả năng hiển thị khi truy tìm lỗi hoặc nói chung khi tiến hành phân tích nguyên nhân gốc rễ. Theo tiêu chuẩn của nó, mô-đun ghi nhật ký, như chúng tôi đã nói trước đây, gửi nhật ký trực tiếp tới bảng điều khiển, nhưng các tùy chọn khả thi khác và cả những tùy chọn được đề xuất, đang sử dụng StreamHandler hoặc SocketHandler để truyền phát qua mạng và kết hợp cũng sử dụng FileHandler để ghi nhật ký . Ngay cả khi việc đăng nhập vào một tệp có những ưu điểm như tránh các lỗi tiềm ẩn liên quan đến mạng và dễ thiết lập, thì trong thời đại ngày nay, nơi các ứng dụng được phân phối qua mạng và mở rộng quy mô nhanh chóng, việc quản lý . Thay vào đó, cách tiếp cận này có thể được coi là một cách thiết thực để sao lưu các tệp nhật ký song song với việc có thể tập trung và giám sát chúng qua một mục tiêu mạng.

Một ví dụ về basicconfig[]

Theo một ví dụ sử dụng BasicConfig[] với một số tham số mặc định để đăng nhập vào đĩa tệp. Các tùy chọn đặt cấp độ để khắc phục sự cố để truyền phát từ sự cố đến các thông điệp cấp cao hơn. Khi bổ sung thông tin, một số tùy chọn định dạng đơn giản được cung cấp. basicConfig[] với một số tham số mặc định để ghi vào tệp đĩa. Các tùy chọn đặt mức thành GỠ LỖI để truyền từ thông báo gỡ lỗi sang thông báo cấp cao hơn. Là thông tin bổ sung, một số tùy chọn định dạng đơn giản được cung cấp.

import logging

logging.basicConfig[level=logging.DEBUG,
                    filename='basic_config_test1.log',
                    format='%[asctime]s %[levelname]s:%[message]s']


def basic_config_test1[]:
   logging.debug["debug log test"]
   logging.error["error log test"]

Chuyển mã trước đó, tệp basic_config_test1. nhật ký mới sẽ được tạo bằng nội dung sau, ngoại trừ ngày, phụ thuộc rõ ràng vào thời gian thực hiện. basic_config_test1. tệp log sẽ được tạo với nội dung sau, ngoại trừ ngày, điều này rõ ràng phụ thuộc vào thời gian thực hiện.

2020-05-08 17:19:29,220 DEBUG:debug log test
2020-05-08 17:19:29,221 ERROR:error log test

Lưu ý. BasicConfig chỉ hoạt động trong lần đầu tiên nó được gọi trong thời gian chạy. Nếu bạn đã cấu hình logger gốc của mình, hãy gọi BasicConfig sẽ không có hiệu lực. Debug-Level Nhật ký hiển thị và nhật ký được ký với tùy chỉnh cấu trúc sau. . basicConfig chỉ hoạt động trong lần đầu tiên nó được gọi trong thời gian chạy. Nếu bạn đã định cấu hình bộ ghi gốc của mình, việc gọi basicConfig sẽ không có tác dụng. Nhật ký cấp GỠ LỖI hiện có thể nhìn thấy và nhật ký được in với cấu trúc tùy chỉnh sau.

  • %[ASCTIME] S. Ngày và giờ địa chỉ của nhật ký hàng
  • %[LevelName] S. Mức độ nghiêm trọng của thông báo
  • %[Tin nhắn] S. Tin nhắn thực tế

Để hoàn thành thông tin ở đây, một bảng mô tả các tùy chọn BasicConfig. Đây là một cách đơn giản và thực tế để định cấu hình các tập lệnh nhỏ. Theo những điều thực sự tốt nhất của Python, chúng tôi khuyên bạn nên quản lý một phiên bản logger cho từng mô-đun trong ứng dụng của bạn, nhưng bạn có thể hiểu rằng điều này có thể là tri thức và ô nhiễm chỉ bằng cách sử dụng . Vì vậy, chúng tôi sẽ tập trung tiếp tục theo cách cải thiện một giải pháp viết nhật ký cơ bản

Đây là một cách đơn giản và thiết thực để định cấu hình các tập lệnh nhỏ. Theo Python các phương pháp hay nhất mà chúng tôi khuyên bạn nên quản lý phiên bản trình ghi nhật ký cho từng mô-đun trong ứng dụng của mình, nhưng có thể hiểu rằng điều này có thể gây khó khăn và không sạch sẽ bằng cách sử dụng basicConfig[]khả năng một mình. Vì vậy, tiếp theo chúng ta sẽ tập trung vào cách cải thiện giải pháp ghi nhật ký cơ bản

Thực hành tốt nhất. Một bộ ghi có thể hiển thị cho mỗi mô-đun

Để thử thách các tiêu chuẩn thực tế tốt nhất, chúng tôi có thể thiết lập một bộ ghi cho mỗi mô-đun giải pháp. Một cách tiếp cận tốt có quy mô rất tốt, nó dễ dàng thiết lập và làm điều đó nên được xem xét khi xử lý các ứng dụng lớn cần mở rộng, là tận dụng phương thức GetLogger [] tích hợp. các ứng dụng lớn cần mở rộng quy mô, là tận dụng lợi thế của phương thức getLogger[] tích hợp sẵn.

logger = logging.getLogger[__name__]

Phương thức này tạo ra một tùy chỉnh logger mới, khác với phương thức gốc. Đối số ß tương ứng với tên đủ điều kiện của mô-đun -mô-đun mà phương thức này được gọi. Điều này cho phép bạn cũng xem xét tên logger, một phần của mỗi hàng nhật ký bằng cách cài đặt tự động tên đó để khớp với một trong các mô-đun hiện tại mà bạn đang làm việc. You could khôi phục tên thuộc tính của Logger với & NBSP; . Đối số ß tương ứng với tên đủ điều kiện của mô-đun mà từ đó . Điều này cho phép bạn cũng xem xét tên của trình ghi nhật ký như một phần của mỗi hàng nhật ký bằng cách tự động đặt tên đó để khớp với một trong các mô-đun hiện tại mà bạn đang làm việc với. Có thể khôi phục thuộc tính tên của trình ghi nhật ký bằng  %[name]s như minh họa trong ví dụ sau.

# logging_test1.py

import logging

logging.basicConfig[level=logging.DEBUG,
                   filename='basic_config_test1.log',
                   format='%[asctime]s %[name]s %[levelname]s:%[message]s']

logger = logging.getLogger[__name__]


def basic_config_test1[]:
   logger.debug["debug log test 1"]
   logger.error["error log test 1"]


# logging_test2.py

import logging
import logging_test1

logger = logging.getLogger[__name__]



def basic_config_test2[]:
   logger.debug["debug log test 2"]
   logger.error["error log test 2"]

Chúng tôi có một cấu hình tốt hơn bây giờ, mỗi mô-đun đang mô tả chính nó bên trong luồng nhật ký và mọi thứ rõ ràng hơn, nhưng dù sao, logger đã được khởi động trong mô-đun logging_test2 . Như đã nêu trước đây, phương thức gọi thứ hai của phương thức basicConfig[] sẽ không có hiệu lực. Do đó, việc thực thi cả hai phương thức basic_config_test1[] và basic_config_test2[] sẽ dẫn đến việc tạo một tệp basic_config_test1. log duy nhất với nội dung sau. cấu hình tốt hơn bây giờ, mỗi mô-đun tự mô tả bên trong luồng nhật ký và mọi thứ rõ ràng hơn, tuy nhiên, trình ghi nhật ký được khởi tạo trong mô-đun logging_test2 sẽ sử dụng . e. cấu hình của bộ ghi gốc. Như đã nêu trước đây, lần gọi thứ hai của phương thức logging_test1 module, i.e. the root logger’s configuration. As stated before, the second invocation of basicConfig[] sẽ không có hiệu lực. Do đó, việc thực hiện cả hai phương thức basic_config_test1[]basic_config_test2[] sẽ cho kết quả . logbasic_config_test1.log với nội dung như sau.

2020-05-09 19:37:59,607 logging_test1 DEBUG:debug log test 1

2020-05-09 19:37:59,607 logging_test1 ERROR:error log test 1

2020-05-09 19:38:05,183 logging_test2 DEBUG:debug log test 2

2020-05-09 19:38:05,183 logging_test2 ERROR:error log test 2

Tùy thuộc vào ngữ cảnh của ứng dụng của bạn, sử dụng một cấu hình duy nhất cho các ký hiệu nhật ký được khởi động trong các mô-đun khác nhau có thể không đủ. Trong phần tiếp theo, chúng ta sẽ xem cách cung cấp cấu hình nhật ký trên nhiều trình ghi nhật ký thông qua fileconfig [] hoặc dictConfig []

Use fileconfig[] và dictconfig[]

Ngay cả khi basicconfig[] là một cách nhanh chóng để bắt đầu tổ chức các cấu hình ghi nhật ký, tệp hoặc từ điển của bạn cung cấp nhiều tùy chọn hơn để tinh chỉnh nhu cầu của bạn, cho phép nhiều hơn một logger trong . Đây cũng là khung cách sử dụng Django và Flask để thiết lập đăng nhập vào các dự án của bạn. Trong các phần tiếp theo, chúng tôi sẽ xem xét kỹ hơn về cách thiết lập cấu hình dựa trên tệp hoặc từ điển giải thích hợp. cách thiết lập tệp thích hợp hoặc cấu hình dựa trên từ điển

fileConfig[]

Cấu hình tệp phải giám sát cấu trúc thủ này, bao gồm một số yếu tố chính. [Người khai thác gỗ]. Tên của các ký tự ghi nhật ký mà chúng ta cần cấu hình. . Các định dạng bạn muốn áp dụng cho từng phần logger. mỗi tệp [được đặt tên trong nhiều số] nên bao gồm một danh sách được phân tách bằng dấu phẩy của một hoặc nhiều từ khóa để liên kết cấu hình thực tế. yếu tố chính. [Người khai thác gỗ]. tên của các logger chúng ta cần cấu hình. [xử lý]. trình xử lý mà chúng tôi muốn sử dụng cho các trình ghi nhật ký cụ thể [e. g. consoleHandler, fileHandler]. [bộ định dạng]. các định dạng bạn muốn áp dụng cho mỗi logger. Mỗi phần của tệp [được đặt tên ở số nhiều] phải bao gồm danh sách một hoặc nhiều khóa được phân tách bằng dấu phẩy để liên kết cấu hình thực tế

[loggers]

keys=root,secondary 

Các khóa được sử dụng để đi qua tệp và đọc các cấu hình phù hợp cho từng phần. Các từ khóa được định nghĩa là [_], trong đó phần tên là logger, người xử lý hoặc định dạng được xác định trước như đã nói trước đó. Một tệp cấu hình nhật ký mẫu [ghi nhật ký. ini] được hiển thị bên dưới

________số 8

Thực tiễn tốt nhất của Python, khuyến nghị duy trì một người xử lý trên mỗi logger dựa trên sự kế thừa của logger trẻ em để nhân giống tài sản. Điều này về cơ bản có nghĩa là bạn chỉ cần gắn một cấu hình cụ thể vào bộ ghi nhật ký cha, để nó được thừa hưởng bởi tất cả các trình ghi nhật ký con mà không cần phải thiết lập nó cho mỗi người trong số chúng tôi. Một ví dụ điển hình về điều này là việc sử dụng thông minh của logger root làm cha mẹ. một trình xử lý cho mỗi bộ ghi dựa trên sự kế thừa của bộ ghi con để truyền thuộc tính. Về cơ bản, điều này có nghĩa là bạn chỉ cần đính kèm một cấu hình cụ thể vào bộ ghi chính, để tất cả các bộ ghi con kế thừa cấu hình đó mà không cần phải thiết lập cấu hình đó cho từng bộ trong số chúng. Một ví dụ điển hình về điều này là việc sử dụng thông minh bộ ghi gốc làm trình ghi gốc. Quay lại đúng hướng, khi bạn đã chuẩn bị xong tệp cấu hình, bạn có thể đính kèm tệp đó vào thiết bị ghi nhật ký bằng những dòng mã đơn giản này.

import logging.config

logging.config.fileConfig['/path/to/logging.ini',
                          disable_existing_loggers=False]
logger = logging.getLogger[__name__]

Trong ví dụ này, chúng tôi cũng bao gồm vô hiệu hóa_hiện_logger được đặt thành sai, đảm bảo rằng các trình ghi nhật ký đã tồn tại trước đó không bị xóa khi đoạn trích này được thực thi;

dictConfig[]

Cấu hình ghi nhật ký với tất cả các thuộc tính mà chúng tôi đã mô tả cũng có thể được định nghĩa là một đối tượng từ điển tiêu chuẩn. Từ điển này phải tuân theo cấu trúc được trình bày cho fileConfig[] với các phần bao gồm trình ghi nhật ký, trình xử lý và trình định dạng với một số tham số chung. Đây là một ví dụ

basicConfig[]
0

Để áp dụng cấu hình này, chỉ cần chuyển nó làm tham số cho cấu hình dict

basicConfig[]
1

dictConfig[] cũng sẽ vô hiệu hóa tất cả các trình ghi nhật ký hiện có trừ khi vô hiệu hóa_hiện_loggers được đặt thành Sai như chúng ta đã làm trong ví dụ fileConfig[] trước đây. Cấu hình này cũng có thể được lưu trữ trong tệp YAML và được định cấu hình từ đó. Nhiều nhà phát triển thường thích sử dụng dictConfig[] hơn fileConfig[], vì nó cung cấp nhiều cách hơn để tùy chỉnh các tham số cũng như dễ đọc và dễ bảo trì hơn

Định dạng nhật ký theo cách JSON

Nhờ cách nó được thiết kế, có thể dễ dàng mở rộng mô-đun ghi nhật ký. Vì mục tiêu của chúng tôi là tự động hóa việc ghi nhật ký và tích hợp nó với Kibana nên chúng tôi muốn có một định dạng phù hợp hơn để thêm thuộc tính tùy chỉnh và tương thích hơn với khối lượng công việc tùy chỉnh. Vì vậy, chúng tôi muốn định cấu hình trình định dạng JSON. Nếu muốn, chúng ta có thể ghi nhật ký JSON bằng cách tạo một trình định dạng tùy chỉnh để chuyển đổi các bản ghi nhật ký thành một chuỗi được mã hóa JSON

basicConfig[]
2

Nếu không muốn tạo trình định dạng tùy chỉnh của riêng mình, bạn có thể dựa vào các thư viện khác nhau do Cộng đồng Python phát triển, có thể giúp bạn chuyển đổi nhật ký của mình sang định dạng JSON. Một trong số đó là python-json-logger để chuyển đổi các bản ghi nhật ký thành JSON. Đầu tiên, cài đặt nó trong môi trường của bạn

basicConfig[]
3

Bây giờ, hãy cập nhật từ điển cấu hình ghi nhật ký để tùy chỉnh trình định dạng hiện có hoặc tạo trình định dạng mới sẽ định dạng nhật ký trong JSON như trong ví dụ bên dưới. Để sử dụng trình định dạng JSON, hãy thêm pythonjsonlogger. jsonlogger. JsonFormatter làm tham chiếu cho thuộc tính "lớp". Trong thuộc tính "định dạng" của trình định dạng, bạn có thể xác định các thuộc tính mà bạn muốn có trong bản ghi JSON của nhật ký

basicConfig[]
4

Nhật ký được gửi tới bảng điều khiển, thông qua trình xử lý tiêu chuẩn, sẽ được ghi ở định dạng JSON. Khi bạn đã bao gồm pythonjsonlogger. jsonlogger. JsonFormatter trong tệp cấu hình ghi nhật ký của bạn, hàm dictConfig[] sẽ có thể tạo một phiên bản của nó miễn là bạn chạy mã từ một môi trường nơi nó có thể nhập mô-đun python-json-logger

Thêm thông tin theo ngữ cảnh vào nhật ký của bạn

Nếu bạn cần thêm một số ngữ cảnh vào nhật ký của mình, mô-đun ghi nhật ký của Python cung cấp cho bạn khả năng đưa các thuộc tính tùy chỉnh vào chúng. Một cách tao nhã để làm phong phú nhật ký của bạn liên quan đến việc sử dụng lớp LoggerAdapter

basicConfig[]
5

Điều này bổ sung hiệu quả các thuộc tính tùy chỉnh cho tất cả các bản ghi đi qua bộ ghi đó. Lưu ý rằng điều này ảnh hưởng đến tất cả các bản ghi nhật ký trong ứng dụng của bạn, bao gồm các thư viện hoặc các khuôn khổ khác mà bạn có thể đang sử dụng và bạn đang gửi nhật ký cho chúng. Nó có thể được sử dụng để ghi lại những thứ như ID yêu cầu duy nhất trên tất cả các dòng nhật ký để theo dõi các yêu cầu hoặc để thêm thông tin theo ngữ cảnh bổ sung

Xử lý ngoại lệ Python và truy nguyên

Theo mặc định, các lỗi không bao gồm bất kỳ thông tin truy nguyên nào. Nhật ký sẽ chỉ hiển thị ngoại lệ dưới dạng lỗi mà không có bất kỳ thông tin nào khác. Để đảm bảo rằng việc ghi nhật ký. error[] in toàn bộ truy nguyên, thêm thuộc tính exc_info với giá trị True. Để thấy sự khác biệt, hãy thử ghi lại một ngoại lệ có và không có exc_info

basicConfig[]
6

Nếu bạn chạy phương thức test[], nó sẽ tạo ra kết quả như sau

basicConfig[]
7

Như chúng ta có thể thấy dòng đầu tiên không cung cấp nhiều thông tin về lỗi ngoài một thông báo chung NameError giả mạo; . Thay vào đó, bạn có thể đạt được kết quả tương tự bằng cách sử dụng trình ghi nhật ký. ngoại lệ [] từ trình xử lý ngoại lệ như trong ví dụ bên dưới

basicConfig[]
8

Điều này có thể truy xuất thông tin theo dõi tương tự bằng cách sử dụng exc_info=True. Điều này cũng có lợi ích là đặt mức độ ưu tiên của nhật ký để ghi nhật ký. LỖI. Bất kể bạn sử dụng phương pháp nào để ghi lại dấu vết, việc có sẵn thông tin ngoại lệ đầy đủ trong nhật ký của bạn là rất quan trọng để theo dõi và khắc phục sự cố hiệu suất của các ứng dụng của bạn

Nắm bắt các ngoại lệ chưa được xử lý

Ngay cả khi nghĩ về mọi tình huống có thể xảy ra, đảm bảo rằng bạn không bao giờ có thể bắt gặp mọi ngoại lệ trong ứng dụng của mình và đây cũng không phải là hành vi được khuyến nghị nhưng bạn vẫn có thể ghi lại các ngoại lệ chưa được phát hiện để có thể điều tra chúng sau này. Một ngoại lệ chưa được xử lý có thể nằm ngoài khối thử/ngoại trừ hoặc khi bạn không đưa đúng loại vào khối ngoại trừ của mình. Nếu một ngoại lệ không được xử lý trong phương thức thì nó sẽ bắt đầu sủi bọt cho đến khi chạm đến một khối ngoại trừ phù hợp hoặc cho đến khi chạm đến khối chính. Nếu nó không bị bắt, nó sẽ trở thành một ngoại lệ chưa được xử lý và trình thông dịch sẽ gọi sys. móc câu[]. Thông tin do phương thức đưa ra thường xuất hiện trong sys. stderr nhưng thông tin truy nguyên sẽ không được ghi vào đó nếu bạn chưa đặt rõ ràng truy nguyên được hiển thị trong trình xử lý không mặc định [e. g. một trình xử lý tệp]. Bạn có thể sử dụng thư viện truy nguyên tiêu chuẩn của Python để định dạng truy nguyên và đưa nó vào thông báo tường trình. Hãy sửa lại chức năng ví dụ của chúng tôi để đưa ra một ngoại lệ không được quản lý bởi khối try except của chúng tôi để xem hành vi mà chúng tôi đã mô tả ở trên

basicConfig[]
9

Chạy mã này sẽ loại bỏ một Oserror ngoại lệ mà không được xử lý trong logic Try-Except, nhưng nhờ có mã Tracback, nó sẽ được ghi lại, vì chúng ta có thể thấy trong lần ngoại trừ mệnh đề thứ hai. mệnh đề

import logging

logging.basicConfig[level=logging.DEBUG,
                    filename='basic_config_test1.log',
                    format='%[asctime]s %[levelname]s:%[message]s']


def basic_config_test1[]:
   logging.debug["debug log test"]
   logging.error["error log test"]
0

Ghi nhật ký toàn bộ dấu vết trong mỗi ngoại lệ đã được xử lý và chưa được xử lý cung cấp khả năng cho thấy tầm quan trọng đối với các lỗi khi chúng xảy ra trong thời gian thực, để bạn có thể xử lý khi nào và tại sao . khả năng hiển thị quan trọng đối với các lỗi khi chúng xảy ra trong thời gian thực, để bạn có thể điều tra khi nào và tại sao chúng xảy ra

Đây là kết thúc cho một phần của bài viết hai phần này, trong phần tiếp theo, chúng tôi sẽ đề cập đến cách tổng hợp nhật ký bằng cách sử dụng Kinesis Stream và Elaticsearch và kết hợp tất cả trong bảng điều khiển Kibana có thể . cách tổng hợp nhật ký bằng Kinesis Stream và ElasticSearch và kết hợp tất cả lại với nhau trong Bảng điều khiển Kibana có khả năng tùy chỉnh cao

Chủ Đề