Bài viết này trình bày những kiến thức cơ bản về cách sử dụng mô-đun ghi nhật ký tiêu chuẩn đi kèm với tất cả các bản phân phối Python. Sau khi đọc phần này, bạn sẽ có thể dễ dàng tích hợp đăng nhập vào ứng dụng Python của mình
Mô-đun ghi nhật ký thư viện tiêu chuẩn
Python đi kèm với một mô-đun ghi nhật ký trong thư viện chuẩn có thể cung cấp một khung linh hoạt để gửi thông báo nhật ký từ các chương trình Python. Mô-đun này được các thư viện sử dụng rộng rãi và thường là điểm truy cập đầu tiên đối với hầu hết các nhà phát triển khi ghi nhật ký
Mô-đun này cung cấp một cách để các ứng dụng định cấu hình các trình xử lý nhật ký khác nhau và cách định tuyến các thông báo nhật ký tới các trình xử lý này. Điều này có thể cho phép cấu hình rất linh hoạt để quản lý nhiều trường hợp sử dụng khác nhau
Để phát ra một thông báo nhật ký, trước tiên người gọi yêu cầu một bộ ghi nhật ký có tên. Ứng dụng có thể sử dụng tên để định cấu hình các quy tắc khác nhau cho các bộ ghi khác nhau. Trình ghi nhật ký này sau đó có thể được sử dụng để phát ra các thông báo có định dạng đơn giản ở các cấp độ nhật ký khác nhau [DEBUG, INFO, ERROR, v.v. ], có thể được ứng dụng sử dụng để xử lý các thông báo có mức độ ưu tiên cao hơn so với các thông báo có mức độ ưu tiên thấp hơn. Mặc dù nghe có vẻ phức tạp, nhưng nó có thể đơn giản như thế này
import logging
log = logging.getLogger["my-logger"]
log.info["Hello, world"]
Trong nội bộ, thông báo được chuyển thành đối tượng LogRecord và được định tuyến đến đối tượng Trình xử lý đã đăng ký cho trình ghi nhật ký này. Trình xử lý sau đó sẽ sử dụng Trình định dạng để biến LogRecord thành một chuỗi và phát ra chuỗi đó
Trong các phần sau, chúng ta sẽ xem xét các ví dụ triển khai và các phương pháp hay nhất để sử dụng mô-đun này
Cấp độ ghi nhật ký
Không phải tất cả các thông điệp bản ghi đều được tạo như nhau. Các mức ghi nhật ký được liệt kê trong tài liệu Python; . Khi bạn đặt cấp độ ghi nhật ký trong Python bằng mô-đun tiêu chuẩn, bạn đang nói với thư viện rằng bạn muốn xử lý tất cả các sự kiện từ cấp độ đó trở lên. Đặt mức nhật ký thành THÔNG TIN sẽ bao gồm các thông báo THÔNG TIN, CẢNH BÁO, LỖI và QUAN TRỌNG. Thông báo NOTSET và DEBUG sẽ không được đưa vào đây
Formattervà một import logging
0vào bộ ghi gốc. Vì điều này quá phổ biến nên mô-đun ghi nhật ký cung cấp một chức năng tiện ích có tên là basicConfig để xử lý hầu hết các trường hợp sử dụng
Các ứng dụng nên định cấu hình ghi nhật ký càng sớm càng tốt, tốt nhất là điều đầu tiên trong ứng dụng, để các thông báo đã ghi không bị mất trong khi khởi động
Cuối cùng, các ứng dụng nên bọc một khối thử/ngoại trừ xung quanh mã ứng dụng chính để gửi bất kỳ ngoại lệ nào thông qua giao diện ghi nhật ký thay vì chỉ tới thiết bị lỗi chuẩn. Đây được gọi là trình xử lý thử bắt toàn cầu. Đó không phải là nơi bạn xử lý tất cả việc ghi nhật ký ngoại lệ của mình và bạn nên tiếp tục lập kế hoạch cho các ngoại lệ trong các khối thử bắt tại các điểm cần thiết trong mã của mình theo quy tắc ngón tay cái
Đối với các công thức ghi nhật ký Python cụ thể, Sách hướng dẫn ghi nhật ký Python là một tài liệu tham khảo tuyệt vời, nhưng nó có thể hơi khó đối với người mới bắt đầu. Trong các phần sau, chúng ta sẽ xem xét một số cấu hình ví dụ để giúp bạn bắt đầu sử dụng mô-đun ghi nhật ký
Ví dụ 1 – Ghi vào đầu ra tiêu chuẩn cho Systemd
Ngày nay, đây có thể là tùy chọn đơn giản nhất và tốt nhất để định cấu hình ghi nhật ký trong những ngày này. Khi sử dụng systemd để chạy daemon, các ứng dụng chỉ có thể gửi thông báo tường trình tới thiết bị xuất chuẩn hoặc thiết bị xuất chuẩn và yêu cầu hệ thống chuyển tiếp thông báo tới tạp chí và nhật ký hệ thống. Là một lợi ích bổ sung, điều này không yêu cầu bắt ngoại lệ, vì Python đã ghi chúng vào lỗi tiêu chuẩn. Điều đó nói rằng, hãy làm theo các quy ước thích hợp và xử lý các ngoại lệ của bạn
Trong trường hợp chạy Python trong các vùng chứa như Docker, ghi nhật ký vào đầu ra tiêu chuẩn thường là cách dễ dàng nhất vì đầu ra này có thể được quản lý trực tiếp và dễ dàng bởi chính vùng chứa
import logging
import logging
2import logging
3import logging
4
Đó là nó. Bây giờ, ứng dụng sẽ ghi tất cả các tin nhắn có mức INFO trở lên vào thiết bị lỗi chuẩn, sử dụng một định dạng đơn giản
import logging
5
Ứng dụng thậm chí có thể được định cấu hình để bao gồm các thông báo GỠ LỖI hoặc có thể chỉ LỖI bằng cách đặt biến môi trường LOGLEVEL
Tuy nhiên, một vấn đề tiềm ẩn với giải pháp này là các ngoại lệ được ghi dưới dạng nhiều dòng, điều này có thể gây ra sự cố cho phân tích sau này. Đáng buồn thay, thường không hoàn toàn đơn giản, nhưng chắc chắn là có thể. Lưu ý cách thực hiện ở đây bên dưới, gọi import logging
6 là cách viết tắt tương đương với import logging
7
import logging
import logging
2log = logging.getLogger["my-logger"]
0log = logging.getLogger["my-logger"]
1log = logging.getLogger["my-logger"]
2log = logging.getLogger["my-logger"]
3log = logging.getLogger["my-logger"]
4log = logging.getLogger["my-logger"]
0log = logging.getLogger["my-logger"]
6log = logging.getLogger["my-logger"]
7log = logging.getLogger["my-logger"]
8log = logging.getLogger["my-logger"]
9log.info["Hello, world"]
0log = logging.getLogger["my-logger"]
0log.info["Hello, world"]
2log.info["Hello, world"]
3log.info["Hello, world"]
4log.info["Hello, world"]
5log.info["Hello, world"]
6log.info["Hello, world"]
7log = logging.getLogger["my-logger"]
0log.info["Hello, world"]
9import logging
0import logging
1import logging
2import logging
3
Ví dụ 2 – Nhật ký hệ thống
Cách khác là gửi trực tiếp tới syslog. Điều này rất tốt cho các hệ điều hành cũ không có systemd. Trong một thế giới lý tưởng, điều này sẽ đơn giản, nhưng thật đáng buồn,. Đây là một thực hiện mẫu
import logging
import logging
5import logging
2log = logging.getLogger["my-logger"]
0import logging
8log = logging.getLogger["my-logger"]
6log = logging.getLogger["my-logger"]
7log = logging.getLogger[__name__]
1log = logging.getLogger["my-logger"]
0log = logging.getLogger[__name__]
3log = logging.getLogger[__name__]
4log.info["Hello, world"]
4log.info["Hello, world"]
5log.info["Hello, world"]
6log.info["Hello, world"]
7log = logging.getLogger["my-logger"]
0log.info["Hello, world"]
9import logging
0import logging
1def do_something[]:
3import logging
3
Ví dụ 3 – Tệp nhật ký
Một tùy chọn khác là ghi các tin nhắn trực tiếp vào một tệp. Điều này hiếm khi hữu ích vào những ngày này, vì quản trị viên có thể định cấu hình nhật ký hệ thống để ghi một số thông báo nhất định vào các tệp cụ thể – hoặc nếu triển khai bên trong các vùng chứa, thì đây là một phản mẫu. Ngoài ra, nếu bạn sử dụng ghi nhật ký tập trung, thì việc xử lý các tệp nhật ký bổ sung là một mối quan tâm bổ sung. Nhưng đó là một tùy chọn vẫn có sẵn
Khi đăng nhập vào tệp, một trong những điều chính cần lưu ý là các tệp nhật ký cần được luân chuyển thường xuyên. Ứng dụng cần phát hiện file log bị đổi tên và xử lý tình huống đó. Mặc dù Python cung cấp trình xử lý xoay vòng tệp của riêng nó, nhưng thông thường, cách tốt nhất là để xoay vòng nhật ký cho các công cụ chuyên dụng như logrotate. WatchedFileHandler sẽ theo dõi tệp nhật ký và mở lại nếu nó được xoay, làm cho nó hoạt động tốt với logrotate mà không yêu cầu bất kỳ tín hiệu cụ thể nào
Đây là một triển khai mẫu
import logging
import logging
5import logging
2log = logging.getLogger["my-logger"]
0def do_something[]:
9 log.debug["Doing something!"]
0 log.debug["Doing something!"]
1log.info["Hello, world"]
4log.info["Hello, world"]
5log.info["Hello, world"]
6log.info["Hello, world"]
7log = logging.getLogger["my-logger"]
0log.info["Hello, world"]
9import logging
0import logging
1def do_something[]:
3import logging
3
Ví dụ 4 – Điểm cuối HTTP
Bạn cũng có thể sử dụng mô-đun ghi nhật ký mặc định của Python để gửi thông báo tường trình tới điểm cuối HTTP. HTTPHandler có thể hữu ích khi bạn đang chạy trong PaaS và không có quyền truy cập máy chủ trực tiếp để thiết lập nhật ký hệ thống hoặc nằm sau tường lửa chặn nhật ký hệ thống bên ngoài và có thể được sử dụng để đăng nhập trực tiếp vào các hệ thống ghi nhật ký tập trung như SolarWinds® Loggly®
Đây là một tập lệnh Python đơn giản sử dụng HTTPHandler để gửi thông báo cảnh báo tới điểm cuối HTTP Loggly
__name__
2__name__
3__name__
4__name__
5__name__
6__name__
7__name__
8__name__
9Formatter
0
Formatter1. Mặc định, chỉ dành cho khả năng tương thích ngược, sẽ vô hiệu hóa mọi trình ghi nhật ký được tạo bởi các mô-đun. Điều này có thể phá vỡ nhiều mô-đun, vì vậy hãy thận trọng khi sử dụng điều này
Bản tóm tắt
Việc ghi nhật ký trong Python thường đơn giản và được chuẩn hóa tốt nhờ khung ghi nhật ký mạnh mẽ ngay trong thư viện chuẩn
Nhiều lần các mô-đun chỉ cần ghi mọi thứ vào một phiên bản trình ghi nhật ký cho tên mô-đun của chúng. Điều này có thể giúp ứng dụng dễ dàng định tuyến thông điệp tường trình của các mô-đun khác nhau đến những nơi khác nhau, nếu cần
Sau đó, các ứng dụng có một số tùy chọn để định cấu hình ghi nhật ký. Tuy nhiên, trong một cơ sở hạ tầng hiện đại, việc tuân theo các phương pháp hay nhất sẽ giúp đơn giản hóa việc này rất nhiều. Trừ khi cần đặc biệt, chỉ cần đăng nhập vàoFormatter
2 và để hệ thống hoặc bộ chứa của bạn xử lý các thông báo tường trình là đủ và là cách tiếp cận tốt nhất