Ví dụ về trình xử lý ghi nhật ký Python

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

Ví dụ về trình xử lý ghi nhật ký Python

Ghi nhật ký từ các Mô-đun

Một ứng dụng Python được tổ chức tốt có khả năng bao gồm nhiều mô-đun. Đôi khi các mô-đun này được sử dụng bởi các chương trình khác. Tuy nhiên, trừ khi bạn đang cố ý phát triển các mô-đun có thể tái sử dụng bên trong ứng dụng của mình, bạn có thể đang sử dụng các mô-đun có sẵn từ PyPI và các mô-đun mà bạn tự viết riêng cho ứng dụng của mình

Nói chung, một mô-đun nên phát ra các thông báo bản ghi như một phương pháp hay nhất và không nên định cấu hình cách các thông báo đó được xử lý. Đó là trách nhiệm của ứng dụng

Các mô-đun có trách nhiệm duy nhất là giúp ứng dụng dễ dàng định tuyến các thông điệp tường trình của chúng. Vì lý do này, theo quy ước, mỗi mô-đun chỉ cần sử dụng một bộ ghi có tên giống như chính mô-đun đó. Điều này giúp ứng dụng dễ dàng định tuyến các mô-đun khác nhau theo cách khác nhau, đồng thời giữ cho mã nhật ký trong mô-đun đơn giản. Mô-đun cần hai dòng để thiết lập ghi nhật ký, sau đó sử dụng trình ghi nhật ký có tên

import logging
log = logging.getLogger(__name__)
def do_something():
    log.debug("Doing something!")

Đó là tất cả để có nó. Trong Python, __name__ chứa tên đầy đủ của mô-đun hiện tại, vì vậy điều này có thể đơn giản hoạt động trong bất kỳ mô-đun nào

Định cấu hình ghi nhật ký

Ứng dụng chính của bạn nên định cấu hình hệ thống con ghi nhật ký để các thông báo nhật ký đi đúng nơi chúng cần. Mô-đun ghi nhật ký Python cung cấp nhiều cách để tinh chỉnh điều này, nhưng đối với hầu hết tất cả các ứng dụng, cấu hình có thể đơn giản

Một cấu hình thường bao gồm việc thêm một Formattervà một import logging0và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 logging2
import logging3
import logging4

Đó 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 logging5

Ứ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 logging6 là cách viết tắt tương đương với import logging7

import logging
import logging2
log = logging.getLogger("my-logger")0
log = logging.getLogger("my-logger")1
log = logging.getLogger("my-logger")2
log = logging.getLogger("my-logger")3
log = logging.getLogger("my-logger")4
log = logging.getLogger("my-logger")0
log = logging.getLogger("my-logger")6
log = logging.getLogger("my-logger")7
log = logging.getLogger("my-logger")8
log = logging.getLogger("my-logger")9
log.info("Hello, world")0
log = logging.getLogger("my-logger")0
log.info("Hello, world")2
log.info("Hello, world")3
log.info("Hello, world")4
log.info("Hello, world")5
log.info("Hello, world")6
log.info("Hello, world")7
log = logging.getLogger("my-logger")0
log.info("Hello, world")9
import logging0
import logging1
import logging2
import logging3

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 logging5
import logging2
log = logging.getLogger("my-logger")0
import logging8
log = logging.getLogger("my-logger")6
log = logging.getLogger("my-logger")7
log = logging.getLogger(__name__)1
log = logging.getLogger("my-logger")0
log = logging.getLogger(__name__)3
log = logging.getLogger(__name__)4
log.info("Hello, world")4
log.info("Hello, world")5
log.info("Hello, world")6
log.info("Hello, world")7
log = logging.getLogger("my-logger")0
log.info("Hello, world")9
import logging0
import logging1
def do_something():3
import logging3

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 logging5
import logging2
log = logging.getLogger("my-logger")0
def do_something():9
    log.debug("Doing something!")0
    log.debug("Doing something!")1
log.info("Hello, world")4
log.info("Hello, world")5
log.info("Hello, world")6
log.info("Hello, world")7
log = logging.getLogger("my-logger")0
log.info("Hello, world")9
import logging0
import logging1
def do_something():3
import logging3

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__9
Formatter0

Ví dụ về trình xử lý ghi nhật ký Python

Thông báo nhật ký trong Loggly được tạo bởi HTTPHandler trong Python

Điểm đến khác

Có thể sử dụng các đích đăng nhập khác và một số khung nhất định sử dụng điều này (e. g. , Django có thể gửi một số thông điệp tường trình dưới dạng email). Nhiều trình xử lý nhật ký phức tạp hơn trong thư viện ghi nhật ký có thể dễ dàng chặn ứng dụng, gây ra sự cố ngừng hoạt động chỉ vì cơ sở hạ tầng ghi nhật ký không phản hồi. Vì những lý do này, cách tốt nhất là giữ cho cấu hình ghi nhật ký của một ứng dụng càng đơn giản càng tốt

Xu hướng ngày càng tăng trong việc ghi nhật ký là tách nó càng nhiều càng tốt khỏi chức năng cốt lõi của ứng dụng của bạn. Bằng cách đó, bạn có thể có các hành vi khác nhau trong các môi trường hoặc bối cảnh triển khai khác nhau. Sử dụng HTTPHandler với một hệ thống như Loggly là một cách đơn giản để bạn có thể dễ dàng đạt được điều này trực tiếp trong ứng dụng của mình

Khi triển khai lên vùng chứa, hãy cố gắng giữ mọi thứ đơn giản nhất có thể. Đăng xuất/lỗi tiêu chuẩn và dựa vào máy chủ vùng chứa hoặc nền tảng điều phối của bạn để xử lý việc tìm ra những việc cần làm với nhật ký. Bạn vẫn có thể sử dụng các dịch vụ tập trung nhật ký, nhưng với cách tiếp cận sidecar hoặc log shipper

Nếu mong muốn một cấu hình chi tiết, mô-đun ghi nhật ký cũng cung cấp khả năng tải cấu hình ghi nhật ký từ tệp cấu hình. Điều này có thể khá mạnh mẽ nhưng hiếm khi cần thiết. Khi tải cấu hình ghi nhật ký từ một tệp, hãy chỉ định 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àoFormatter2 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

Trình xử lý trong ghi nhật ký Python là gì?

Trình xử lý ghi nhật ký Python . Hiển thị nó trong bảng điều khiển (thông qua StreamHandler), trong tệp (thông qua FileHandler) hoặc thậm chí bằng cách gửi email cho bạn qua SMTPHandler, v.v. Mỗi trình xử lý nhật ký có 2 trường quan trọng. Một trình định dạng thêm thông tin ngữ cảnh vào nhật ký. the component that effectively writes/displays a log: Display it in the console (via StreamHandler), in a file (via FileHandler), or even by sending you an email via SMTPHandler, etc. Each log handler has 2 important fields: A formatter which adds context information to a log.

Làm cách nào để thêm trình xử lý vào trình ghi Python?

Bảng điều khiển StreamHandler(). setLevel(đăng nhập. THÔNG TIN) # đặt định dạng đơn giản hơn cho bảng điều khiển sử dụng formatter = logging. Trình định dạng('%(name)-12s. %(levelname)-8s %(message)s') # yêu cầu trình xử lý sử dụng định dạng này console. setFormatter(formatter) # thêm trình xử lý vào nhật ký logger gốc.

Trình xử lý trong logger là gì?

Đối tượng Trình xử lý lấy thông báo nhật ký từ Trình ghi nhật ký và xuất chúng . Ví dụ, nó có thể ghi chúng vào bảng điều khiển hoặc ghi chúng vào một tệp hoặc gửi chúng đến dịch vụ ghi nhật ký mạng hoặc chuyển tiếp chúng đến nhật ký hệ điều hành hoặc bất cứ điều gì. Trình xử lý có thể bị vô hiệu hóa bằng cách thực hiện setLevel(Level.

Làm cách nào để sử dụng trình xử lý trong Python?

Trình xử lý cuộc gọi là một phương thức được sử dụng để xử lý từng lệnh gọi hàm Python. Khi tạo một phiên bản chức năng, bạn nên chỉ định một điểm nhập bao gồm tên tệp và tên trình xử lý cuộc gọi (chẳng hạn như chính. xử lý). Tại bất kỳ thời điểm nào, một phiên bản chức năng duy nhất chỉ xử lý một yêu cầu.