Thiết bị xuất chuẩn Python vào tệp và bảng điều khiển

Stdout được python sử dụng để hiển thị đầu ra văn bản của các lệnh mà bạn chạy trên thiết bị đầu cuối hoặc trong tập lệnh python. Stderr được gọi khi có bất kỳ lỗi nào trong khi chạy lệnh của bạn. Đây cũng là trường hợp bất cứ khi nào bạn chạy bất kỳ lệnh nào khác, không chỉ python và bất kỳ tập lệnh nào khác, chẳng hạn như tập lệnh shell, trong thiết bị đầu cuối. Vấn đề là một khi các thông báo thiết bị xuất chuẩn và thiết bị xuất chuẩn này được hiển thị, chúng không thể được truy xuất lại sau này để tham khảo trong tương lai. Các lệnh/tập lệnh tiếp theo sẽ đẩy chúng ra khỏi màn hình. Trong những trường hợp như vậy, nên chuyển hướng thiết bị xuất chuẩn & thiết bị xuất chuẩn sang tệp trong Python. Trong bài viết này, chúng ta sẽ tìm hiểu cách làm điều này khi bạn sử dụng python


Cách chuyển hướng thiết bị xuất chuẩn & thiết bị xuất chuẩn sang tệp trong Python

Trong trăn, sys. thiết bị xuất chuẩn chứa đầu ra mới nhất của thiết bị xuất chuẩn và sys. stderr chứa đầu ra stderr

Một trong những cách để chuyển hướng các đầu ra này sang tệp là đặt chúng thành một đối tượng tệp như hình bên dưới. Sử dụng phương pháp này nếu bạn muốn chuyển hướng đầu ra từ bên trong tập lệnh

import sys
with open('file', 'w') as sys.stdout:
    print('test')

Ngoài ra, bạn có thể chuyển hướng đầu ra sang một tệp (e. g. tùy tùng. txt) bằng cách sử dụng chuyển hướng shell

$ python3 foo.py > op.txt

Tương tự bạn cũng có thể set stderr thành file như hình bên dưới. Nếu nó không hiệu quả với bạn, vui lòng thử phương pháp tiếp theo được đề cập bên dưới

import sys
with open('file', 'w') as sys.stderr:
    print('test')

Nếu bạn đang sử dụng python>3. 4, bạn có thể sử dụng contextlib. redirect_stderr để chuyển hướng đầu ra stderr sang tệp. Đây là một ví dụ

from contextlib import redirect_stderr

with open('filename.log', 'w') as stderr, redirect_stderr(stderr):

    print(1/0)    # errors from here are logged to the file.

Trong ví dụ trên, chúng tôi đã cố tình đưa ra một ngoại lệ bằng cách chia 1 cho 0. Thông báo lỗi được ghi vào tên tệp. tệp nhật ký

Không giống như chuyển hướng thiết bị xuất chuẩn sang tệp, có một chút khó khăn khi gửi đầu ra thiết bị xuất chuẩn sang tệp do lỗi xảy ra thường làm hỏng quá trình thực thi mã. Vì vậy, nên sử dụng contextlib cho các mục đích như vậy

Trong bài viết này, chúng ta đã học cách chuyển hướng thiết bị xuất chuẩn và thiết bị xuất chuẩn sang tệp. Bạn có thể sử dụng chúng để ghi lại thông báo lỗi và đầu ra của các lệnh và tập lệnh python của bạn để tham khảo trong tương lai

[Mike Muller]


> Điều này chuyển hướng tất cả đầu ra từ Python sang tệp đang mở
> Đồng thời tôi muốn xem tất cả văn bản được in trên màn hình
> Làm thế nào tôi có thể làm điều này?

Ý tưởng cơ bản giống nhau

#. /usr/bin/env con trăn

nhập khẩu hệ thống

lớp MyWriter

def __init__(bản thân, thiết bị xuất chuẩn, tên tệp)
bản thân. thiết bị xuất chuẩn = thiết bị xuất chuẩn
bản thân. tệp nhật ký = tệp (tên tệp, 'a')

def write(bản thân, văn bản)
bản thân. tiêu chuẩn. viết (văn bản)
bản thân. tệp nhật ký. viết (văn bản)

chắc chắn đóng (tự)
bản thân. tiêu chuẩn. Thoát()
bản thân. tệp nhật ký. Thoát()

nhà văn = MyWriter(sys. thiết bị xuất chuẩn, 'nhật ký. txt')
hệ thống. stdout = nhà văn

in 'kiểm tra'

Chúc mừng,

// m

-

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 đó;

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=INFO
4

Thông tin chi tiết, thường chỉ được quan tâm khi chẩn đoán sự cố

--log=INFO
5

Xác nhận rằng mọi thứ đang hoạt động như mong đợi

--log=INFO
6

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=INFO
7

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=INFO
8

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=INFO
6, 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ản

Mộ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=INFO
5 không xuất hiện vì mức mặc định là
--log=INFO
6. 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 tin

Mộ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=INFO
4, 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 cuộc 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ô-đun

Nế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ẫu sử dụng đơn giản này, bạn sẽ không biết, bằng cách xem trong 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 nhiều thứ 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 cao

Thư 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

  • Trình ghi nhật ký hiển thị giao diện mà mã ứng dụng trực tiếp sử dụng

  • Trình xử lý gửi bản ghi nhật ký (được tạo bởi trình ghi nhật ký) đến đích thích hợp

  • Bộ lọc cung cấp cơ sở chi tiết hơn để xác định bản ghi nhật ký nào sẽ xuất ra

  • Trình định dạng chỉ định bố cục của các bản ghi nhật ký trong đầu ra cuối cù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

Thiết bị xuất chuẩn Python vào tệp và bảng điều khiển

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

  • chỉ định thông báo nhật ký có mức độ nghiêm trọng thấp nhất mà trình ghi nhật ký sẽ xử lý, trong đó gỡ lỗi là mức độ nghiêm trọng tích hợp sẵn thấp nhất và nghiêm trọng là mức độ nghiêm trọng tích hợp sẵn cao nhất. Ví dụ: nếu mức độ nghiêm trọng là THÔNG TIN, thiết bị ghi nhật ký sẽ chỉ xử lý các thông báo THÔNG TIN, CẢNH BÁO, LỖI và QUAN TRỌNG và sẽ bỏ qua các thông báo GỠ LỖI

  • và thêm và xóa các đối tượng xử lý khỏi đối tượng logger. Trình xử lý được đề cập chi tiết hơn trong

  • và thêm và xóa các đối tượng bộ lọc khỏi đối tượng logger. Các bộ lọc được trình bày chi tiết hơn trong

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

  • , , , và tất cả tạo các bản ghi nhật ký với thông báo và cấp độ tương ứng với tên phương thức tương ứng của chúng. Thông báo thực sự là một chuỗi định dạng, có thể chứa cú pháp thay thế chuỗi tiêu chuẩn của

    # mylib.py
    import logging
    
    def do_something():
        logging.info('Doing something')
    
    2,
    # mylib.py
    import logging
    
    def do_something():
        logging.info('Doing something')
    
    3,
    # mylib.py
    import logging
    
    def do_something():
        logging.info('Doing something')
    
    4, v.v. Phần còn lại của các đối số của chúng là danh sách các đối tượng tương ứng với các trường thay thế trong thông báo. Đối với
    # mylib.py
    import logging
    
    def do_something():
        logging.info('Doing something')
    
    5, các phương pháp ghi nhật ký chỉ quan tâm đến từ khóa của
    # mylib.py
    import logging
    
    def do_something():
        logging.info('Doing something')
    
    6 và sử dụng nó để xác định xem có nên ghi thông tin ngoại lệ hay không

  • tạo một thông điệp tường trình tương tự như. Sự khác biệt là kết xuất một dấu vết ngăn xếp cùng với nó. Chỉ gọi phương thức này từ một trình xử lý ngoại lệ

  • lấy một cấp nhật ký làm đối số rõ ràng. Cách này dài dòng hơn một chút đối với việc ghi nhật ký thông báo so với việc sử dụng các phương pháp tiện lợi ở cấp độ nhật ký được liệt kê ở trên, nhưng đây là cách ghi nhật ký ở các cấp độ nhật ký tùy chỉ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 (_______4_______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

  • Phương thức, giống như trong các đối tượng logger, chỉ định mức độ nghiêm trọng thấp nhất sẽ được gửi đến đích thích hợp. Tại sao có hai phương pháp

    WARNING:root:Watch out!
    
    16? . Mức được đặt trong mỗi trình xử lý xác định thông báo mà trình xử lý đó sẽ gửi trên

  • chọn một đối tượng Formatter để trình xử lý này sử dụng

  • và tương ứng cấu hình và giải cấu hình các đối tượng bộ lọc trên bộ xử lý

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ạng

Cá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

  1. Tạo trình ghi nhật ký, trình xử lý và trình định dạng một cách rõ ràng bằng cách sử dụng mã Python gọi các phương thức cấu hình được liệt kê ở trên

  2. Tạo tệp cấu hình ghi nhật ký và đọc nó bằng chức năng

  3. Tạo một từ điển thông tin cấu hình và chuyển nó đến chức năng

Để 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 một lớp được xác định trong gói
WARNING:root:Watch out!
56 và mô-đun
WARNING:root:Watch out!
57, trong đó _____11_______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 vào 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 để 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ấp

Nế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

  • Nếu đăng nhập. raiseExceptions là

    WARNING:root:Watch out!
    
    10 (chế độ sản xuất), sự kiện sẽ bị hủy một cách lặng lẽ

  • Nếu đăng nhập. raiseExceptions là

    WARNING:root:Watch out!
    
    47 (chế độ phát triển), một thông báo 'Không thể tìm thấy trình xử lý nào cho logger X. Y. Z’ được in một lần

Trong Trăn 3. 2 trở lên, hành vi như sau

  • Sự kiện được xuất ra bằng cách sử dụng 'trình xử lý phương sách cuối cùng', được lưu trữ trong

    WARNING:root:Watch out!
    
    61. Trình xử lý nội bộ này không được liên kết với bất kỳ trình ghi nhật ký nào và hoạt động như một trình ghi thông báo mô tả sự kiện vào giá trị hiện tại của
    logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
    
    8 (do đó tôn trọng mọi chuyển hướng có thể có hiệu lực). Không có định dạng nào được thực hiện trên thư - chỉ có thông báo mô tả sự kiện trống được in. Cấp độ của trình xử lý được đặt thành
    --log=INFO
    
    6, vì vậy tất cả các sự kiện ở mức độ nghiêm trọng này và lớn hơn sẽ được xuất ra

Để 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ện

Khi 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=INFO
6 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=INFO
8

50

--log=INFO
7

40

--log=INFO
6

30

--log=INFO
5

20

--log=INFO
4

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ỉnh

Có 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 chắc rằng mình cần các mức tùy chỉnh, thì 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 ích

Ngoài lớp cơ sở, nhiều lớp con hữu ích được cung cấp

  1. trường hợp gửi tin nhắn đến luồng (đối tượng giống như tệp)

  2. trường hợp gửi tin nhắn đến tập tin đĩa

  3. là lớp cơ sở cho các trình xử lý xoay tệp nhật ký tại một điểm nhất định. Nó không có nghĩa là được khởi tạo trực tiếp. Thay vào đó, sử dụng hoặc

  4. các phiên bản gửi tin nhắn đến tệp đĩa, với sự hỗ trợ cho kích thước tệp nhật ký tối đa và xoay vòng tệp nhật ký

  5. các trường hợp gửi tin nhắn đến các tệp đĩa, xoay tệp nhật ký theo các khoảng thời gian nhất định

  6. trường hợp gửi tin nhắn đến ổ cắm TCP/IP. kể từ 3. 4, Ổ cắm tên miền Unix cũng được hỗ trợ

  7. trường hợp gửi tin nhắn đến ổ cắm UDP. kể từ 3. 4, Ổ cắm tên miền Unix cũng được hỗ trợ

  8. trường hợp gửi tin nhắn đến một địa chỉ email được chỉ định

  9. các trường hợp gửi tin nhắn đến một trình nền nhật ký hệ thống Unix, có thể trên một máy từ xa

  10. trường hợp gửi tin nhắn đến nhật ký sự kiện Windows NT/2000/XP

  11. các trường hợp gửi tin nhắn đến một bộ đệm trong bộ nhớ, bộ đệm này sẽ bị xóa bất cứ khi nào đáp ứng các tiêu chí cụ thể

  12. trường hợp gửi tin nhắn đến máy chủ HTTP sử dụng ngữ nghĩ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ö')
    
    04 hoặc
    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ö')
    
    05

  13. các phiên bản xem tệp mà họ đang đăng nhập. Nếu tệp thay đổi, tệp sẽ được đóng và mở lại bằng tên tệp. Trình xử lý này chỉ hữu ích trên các hệ thống giống Unix;

  14. các phiên bản gửi tin nhắn đến một hàng đợi, chẳng hạn như những tin nhắn được triển khai trong hoặc các mô-đun

  15. trường hợp không làm gì với thông báo lỗi. Chúng được sử dụng bởi các nhà phát triển thư viện muốn sử dụng ghi nhật ký, nhưng muốn tránh thông báo 'Không thể tìm thấy trình xử lý nào cho trình ghi nhật ký XXX' có thể hiển thị nếu người dùng thư viện chưa định cấu hình ghi nhật ký. Xem để biết thêm thông tin

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 con,. (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 đợt, 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 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ắn

Trong 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=INFO
4, các lệnh gọi tớ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ö')
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

Làm cách nào để bạn chuyển hướng đầu ra từ thiết bị xuất chuẩn sang một tệp trong Python?

stdout = original print('Chuỗi này chuyển tới thiết bị xuất chuẩn, KHÔNG phải tệp. ') nếu __name__ == '__main__'. Chuyển hướng stdout / stderr redirect_to_file('Python rock. ') Ở đây chúng ta chỉ cần nhập mô-đun sys của Python và tạo một hàm mà chúng ta có thể chuyển các chuỗi mà chúng ta muốn chuyển hướng đến một tệp.

Làm cách nào để lưu trữ đầu ra của bảng điều khiển bằng Python?

Để in các chuỗi lên bảng điều khiển hoặc lặp lại một số dữ liệu tới đầu ra của bảng điều khiển, hãy sử dụng hàm print() có sẵn của Python . hàm print() có thể lấy các loại giá trị khác nhau làm (các) đối số, như chuỗi, số nguyên, dấu phẩy, v.v. , hoặc đối tượng của một loại lớp. Sau đây là minh họa đơn giản về cách sử dụng hàm print() trong trình bao Python.

Làm cách nào để lưu đầu ra dấu nhắc lệnh vào tệp văn bản trong Python?

Để lưu đầu ra lệnh vào tệp văn bản bằng Dấu nhắc Lệnh, hãy làm theo các bước sau. .
Mở bắt đầu
Tìm kiếm Dấu nhắc Lệnh
Bấm chuột phải vào kết quả trên cùng và chọn tùy chọn Chạy với tư cách quản trị viên
Nhập lệnh sau để lưu đầu ra vào tệp văn bản và nhấn Enter. LỆNH CỦA BẠN > C. \PATH\TO\FOLDER\OUTPUT. txt