Hướng dẫn how do i save a log file in python? - làm cách nào để lưu tệp nhật ký trong python?

Đây là một cách đơn giản hơn để đi về nó. Giải pháp này không sử dụng từ điển cấu hình và sử dụng trình xử lý tệp xoay, như vậy:

Show
import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(handlers=[RotatingFileHandler(filename=logpath+filename,
                     mode='w', maxBytes=512000, backupCount=4)], level=debug_level,
                     format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')

Hoặc như vậy:

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')

Biến xử lý cần phải là một điều khác. LogPath+FileName và Debug_Level chỉ là các biến chứa thông tin tương ứng. Tất nhiên, các giá trị cho các tham số hàm là tùy thuộc vào bạn.

Lần đầu tiên tôi sử dụng mô -đun ghi nhật ký, tôi đã phạm sai lầm khi viết như sau, tạo ra lỗi khóa tệp HĐH (ở trên là giải pháp cho điều đó):

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))

Đây là cách tạo tệp nhật ký trong notepad:.

Chọn Bắt đầu, Nhập Notepad và chọn nó từ kết quả ..

Loại hình . Đăng nhập vào dòng đầu tiên, sau đó nhấn Enter để chuyển sang dòng tiếp theo ..

Trên menu Tệp, nhấp vào Lưu dưới dạng, nhập tên mô tả cho tệp của bạn vào hộp tên tệp, sau đó bấm OK ..

Khi nào nên sử dụng Logging¶

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à

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
1,
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
2,
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
3,
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
4 và
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
5. Để xác định khi nào nên sử dụng ghi nhật ký, hãy xem bảng bên dưới, trong đó, cho mỗi tập hợp các nhiệm vụ phổ biến, công cụ tốt nhất để sử dụng cho nó.

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 bảng điều khiển để sử dụng thông thường của tập lệnh hoặc chương trình dòng lệnh

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
6

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 (ví dụ: để theo dõi trạng thái hoặc điều tra lỗi)

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
7 (hoặc
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
8 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ể

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
9 trong mã thư viện nếu sự cố là có thể tránh được và ứng dụng máy khách phải được sửa đổi để loại bỏ cảnh báo

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 Nếu không có gì ứng dụng khách hàng có thể làm về tình huống, nhưng sự kiện vẫn cần lưu ý

Báo cáo một lỗi liên quan đến một sự kiện thời gian chạy cụ thể

Nâng cao một ngoại lệ

Báo cáo đàn áp lỗi mà không gây ra ngoại lệ (ví dụ: trình xử lý lỗi trong quy trình máy chủ dà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ö')
1,
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 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ö')
3 khi phù hợp với lỗi cụ thể và miền ứng dụng

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 ứng dụng của chúng được mô tả dưới đây (theo thứ tự ngày càng tăng của mức độ nghiêm trọng):

Mức độ

Khi nó được 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ö')
4

Thông tin chi tiết, thường chỉ được quan tâm khi chẩn đoán các vấ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ö')
5

Xác nhận rằng mọi thứ đang hoạt động như mong đợ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ö')
6

Một dấu hiệu cho thấy một điều gì đó bất ngờ đã xảy ra, hoặc chỉ ra một số vấn đề trong tương lai gần (ví dụ: không gian đĩa thấp). Phần mềm vẫn đang hoạt động như mong đợ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ö')
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.

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

Một lỗi nghiêm trọng, chỉ ra rằng bản thân chương trình có thể không thể tiếp tục chạy.

Mức 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ö')
6, có nghĩa là chỉ các sự kiện ở cấp độ này trở lên sẽ được theo dõi, trừ khi gói ghi nhật ký được cấu hình để làm khác.

Các sự kiện được theo dõi có thể được xử lý theo những cách khác nhau. Cách đơn giản nhất để xử lý các sự kiện theo dõi là in chúng vào bảng điều khiển. Một cách phổ biến khác là viết 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 các dòng này vào một tập lệnh và chạy nó, bạn sẽ thấy:

in ra trên bảng điều khiển. Thông báo

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 không xuất hiện vì mức 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ö')
6. Thông báo được in bao gồm dấu hiệu của cấp độ và mô tả về sự kiện được cung cấp trong cuộc gọi đăng nhập, tức là ‘xem ra! Bây giờ đừng lo lắng về phần root gốc: 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 đó; Tùy chọn định dạng cũng sẽ được giải thích sau.

Đă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 để Lôi nhìn vào đó tiếp theo. Hãy chắc chắn thử những điều sau đây trong một phiên dịch viên Python mới bắt đầu và don lồ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 trước đó 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

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ö
2. Mặc dù không được hiển thị trong ví dụ trên, một đối số lỗi hiện cũng có thể được thông qua, xác định cách xử lý lỗi mã hóa. Để biết các giá trị có sẵn và mặc định, hãy xem tài liệu cho
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ö
2.The encoding argument was added. In earlier Python versions, or if not specified, the encoding used is the default value used by
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ö
2. While not shown in the above example, an errors argument can also now be passed, which determines how encoding errors are handled. For available values and the default, see the documentation for
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ö
2.

Và bây giờ nếu chúng ta mở tệp và xem xét những gì chúng ta có, chúng ta nên tìm các thông báo nhật ký:

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

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, tất cả các tin nhắn đã được in.

Nếu bạn muốn đặt mức ghi nhật ký từ tùy chọn dòng lệnh như:

Và bạn có giá trị của tham số được truyền cho

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ö
5 trong một số loglevel biến, bạn có thể sử dụng:

getattr(logging, loglevel.upper())

Để có được giá trị mà bạn sẽ chuyển sang

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ö
6 thông qua đối số cấp độ. Bạn có thể muốn lỗi kiểm tra bất kỳ giá trị đầu vào người dùng nào, có lẽ 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

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ö
6 sẽ đến trước mọi cuộc gọi đến
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
1,
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
2, v.v. Nếu không, các chức năng đó sẽ gọi
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ö
6 cho bạn với các tùy chọn mặc định. Vì nó dự định là một cơ sở cấu hình đơn giản một lần, chỉ có cuộc gọi đầu tiên thực sự sẽ làm bất cứ điều gì: các cuộc gọi tiếp theo là không có hiệu quả.

Nếu bạn chạy tập lệnh trên nhiều lần, các tin nhắn từ các lần chạy liên tiếp sẽ được thêm vào ví dụ tệp.log. Nếu bạn muốn mỗi lần chạy bắt đầu một lần nữa, không nhớ các tin nhắn từ các lần chạy trước đó, bạn có thể chỉ định đối số FILEMODE, 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 đây, nhưng tệp nhật ký không còn được thêm vào, vì vậy các tin nhắn từ các lần chạy trước đó 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, thì đây là một ví dụ về cách bạn có thể sắp xếp đăng nhập vào đó:

# 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()

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
0

Nếu bạn chạy myApp.py, bạn sẽ thấy điều này trong myApp.log:

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
1

Đó là hy vọng những gì bạn đã mong đợi để xem. Bạn có thể khái quát đ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 đã giành chiến thắng, bằng cách xem trong tệp nhật ký, trong đó trong ứng dụng của bạn, tin nhắn của bạn đến, ngoài việc xem xét mô tả sự kiện. Nếu bạn muốn theo dõi vị trí của các tin nhắn của mình, bạn sẽ cần phải tham khảo tài liệu vượt quá cấp độ hướng dẫn - xem hướng dẫn đăng nhập nâng cao.Advanced Logging Tutorial.

Dữ liệu biến ghi nhật ký

Để nhật ký 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 dữ liệu biến làm đối số. Ví dụ:

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
2

sẽ hiển thị:

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
3

Như bạn có thể thấy, việc hợp nhất dữ liệu biến vào thông báo Mô tả sự kiện sử dụng kiểu cũ, kiểu %của định dạng chuỗi. Đâ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ư

getattr(logging, loglevel.upper())
1 và
getattr(logging, loglevel.upper())
2. Các tùy chọn định dạng mới hơn này được hỗ trợ, nhưng khám phá chúng nằm ngoài phạm vi của hướng dẫn này: Xem bằng cách sử dụng các kiểu định dạng cụ thể trong suốt ứng dụng của bạn để biết thêm thông tin.Using particular formatting styles throughout your application for more information.

Thay đổi định dạng của các tin nhắn được hiển thị lor

Để 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:

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
4

cái nào sẽ in:

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
5

Lưu ý rằng ‘root, xuất hiện trong các ví dụ trước đó đã biến mất. Đối với một tập hợp đầy đủ các thứ có thể xuất hiện trong các chuỗi định dạng, bạn có thể tham khảo tài liệu cho các thuộc tính logrecord, nhưng để sử dụng đơn giản, bạn chỉ cần tên mức độ (mức độ nghiêm trọng), tin nhắn (mô tả sự kiện, bao gồm dữ liệu biến) và có lẽ để hiển thị Khi sự kiện xảy ra. Nó được mô tả trong phần sau.LogRecord attributes, but for simple usage, you just need the levelname (severity), message (event description, including variable data) and perhaps to display when the event occurred. This is described in the next section.

Hiển thị ngày/giờ trong Tin nhắn

Để hiển thị ngày và thời gian của một sự kiện, bạn sẽ đặt ‘%(ASCTIME) S trong chuỗi định dạng của bạn:

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
6

Mà sẽ in một cái gì đó như thế này:

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
7

Định dạng mặc định cho hiển thị ngày/thời gian (hiển thị ở trên) giống như ISO8601 hoặc RFC 3339. Nếu bạn cần kiểm soát thêm định dạng ngày/giờ, hãy cung cấp đối số DATEFMT cho

getattr(logging, loglevel.upper())
3, như trong ví dụ này:RFC 3339. If you need more control over the formatting of the date/time, provide a datefmt argument to
getattr(logging, loglevel.upper())
3, as in this example:

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
8

Mà sẽ hiển thị một cái gì đó như thế này:

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
9

Định dạng của đối số DATEFMT giống như được hỗ trợ bởi

getattr(logging, loglevel.upper())
4.

Bước tiếp theo¶

Điều đó kết thúc hướng dẫn cơ bản. Nó là đủ để giúp bạn đứng dậy và chạy với ghi nhật ký. Có rất nhiều điều 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 phải đầ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 cho điều đó, hãy lấy một số đồ 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 rất đơn giản, thì hãy sử dụng các ví dụ trên để kết hợp ghi nhật ký vào các tập lệnh của riêng bạn và nếu bạn gặp vấn đề hoặc không hiểu điều gì đó, vui lòng đăng một câu hỏi trên nhóm comp.lang.python usenet (có sẵn tại https : //groups.google.com/forum/#! Diễn đàn/comp.lang.python) và bạn sẽ nhận được sự giúp đỡ trước khi quá lâu.

Vẫn ở đây? Bạn có thể tiếp tục đọc một vài phần tiếp theo, cung cấp một hướng dẫn nâng cao/chuyên sâu hơn một chút so với phần cơ bản ở trên. Sau đó, bạn có thể xem sách nấu ăn đăng nhập.Logging Cookbook.

Hướng dẫn đăng nhập nâng cao

Thư viện ghi nhật ký có cách tiếp cận mô -đun và cung cấp một số loại thành phần: loggers, trình xử lý, bộ lọc và định dạng.

  • Loggers hiển thị giao diện mà mã ứng dụng sử dụng trực tiếp.

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

  • Các bộ lọc cung cấp một cơ sở hạt mịn hơn để xác định bản ghi nhật ký nào vào đầu ra.

  • Formatters 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 loggers, trình xử lý, bộ lọc và định dạng trong một ví dụ

getattr(logging, loglevel.upper())
5.

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 trường hợp của lớp

getattr(logging, loglevel.upper())
6 (sau đây gọi là loggers). Mỗi trường hợp có một tên và chúng được sắp xếp theo khái niệm theo 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 (thời kỳ) làm dấu phân cách. Ví dụ: một logger có tên ‘quét, là cha mẹ của loggers‘ scan.text, ‘scan.html, và‘ scan.pdf. Tên logger có thể là bất cứ điều gì bạn muốn và chỉ ra khu vực của một ứng dụng trong đó một tin nhắn đã ghi lại bắt nguồn.

Một quy ước tốt để sử dụng khi đặt tên loggers là sử dụng logger cấp mô-đun, trong mỗi mô-đun sử dụng ghi nhật ký, được đặt tên như sau:

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
0

Điều này có nghĩa là tên logger theo dõi hệ thống phân cấp gói/mô -đun và nó rõ ràng trực giác khi các sự kiện được ghi lại chỉ từ tên logger.

Rễ của hệ thống phân cấp của loggers được gọi là logger gốc. Đó là bộ ghi âm được sử dụng bởi các hàm

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
1,
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
2,
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
3,
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
4 và
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
5, mà chỉ gọi phương thức đặt tên giống nhau của bộ ghi gốc. Các chức năng và các phương pháp có cùng chữ ký. Tên logger gốc được in dưới dạng ‘root, trong đầu ra đã ghi.

Tất nhiên, đó có thể đăng nhập tin nhắn vào các điểm đến khác nhau. Hỗ trợ được bao gồm trong gói để ghi tin nhắn nhật ký vào các tệp, vị trí HTTP GET/POST, email qua SMTP, ổ cắm chung, hàng đợi hoặc cơ chế ghi nhật ký cụ thể của OS như Syslog 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 đăng nhập 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 xử lý tích hợp nào.

Theo mặc định, không có đích nào được đặt cho bất kỳ tin nhắn ghi nhật ký nào. Bạn có thể chỉ định một đích (chẳng hạn như bảng điều khiển hoặc tệp) bằng cách sử dụng

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ö
6 như trong các ví dụ hướng dẫn. Nếu bạn gọi các chức năng
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
1,
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
2,
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
3,
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
4 và
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
5, họ sẽ kiểm tra xem liệu không có đích nào được đặt; và nếu một người không được đặt, họ sẽ đặt đích của bảng điều khiển (
# 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, ...)
8) và định dạng mặc định cho thông báo được hiển thị trước khi ủy thác cho bộ ghi gốc để thực hiện đầu ra thông báo thực tế.

Định dạng mặc định được đặt bởi

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ö
6 cho tin nhắn là:

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
1

Bạn có thể thay đổi điều này bằng cách chuyển một chuỗi định dạng sang

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ö
6 với đối số từ khóa định dạng. Đối với tất cả các tùy chọn liên quan đến cách xây dựng chuỗi định dạng, hãy xem các đối tượng Formatter.Formatter Objects.

Lưu lượng ghi nhật ký

Dòng thông tin sự kiện nhật ký trong loggers và trình xử lý được minh họa trong sơ đồ sau.

Hướng dẫn how do i save a log file in python? - làm cách nào để lưu tệp nhật ký trong python?

Người khai thác gỗ¶

getattr(logging, loglevel.upper())
6 Đối tượng có một công việc ba lần. Đầu tiên, họ hiển thị một số phương thức vào mã ứng dụng để các ứng dụng có thể đăng nhập tin nhắn 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 các đối tượng bộ lọc. Thứ ba, các đối tượng logger chuyển các tin nhắn nhật ký có liên quan cho tất cả các trình xử lý nhật ký quan tâm.

Các phương thức được sử dụng rộng rãi nhất trên các đối tượng logger rơi vào 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:

  • logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
    
    2 Chỉ định thông báo nhật ký mức độ nghiêm trọng thấp nhất mà logger sẽ xử lý, trong đó gỡ lỗi là mức độ nghiêm trọng tích hợp thấp nhất và quan trọng là mức độ nghiêm trọng tích hợp cao nhất. Ví dụ: nếu mức độ nghiêm trọng là thông tin, logger sẽ chỉ xử lý thông tin, cảnh báo, lỗi và tin nhắn quan trọng và sẽ bỏ qua các tin nhắn gỡ lỗi.

  • logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
    
    3 và
    logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
    
    4 Thêm và xóa các đối tượng xử lý khỏi đối tượng logger. Người xử lý được đề cập chi tiết hơn trong người xử lý.Handlers.

  • logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
    
    5 và
    logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
    
    6 Thêm và xóa các đối tượng bộ lọc khỏi đối tượng logger. Bộ lọc được đề cập chi tiết hơn trong các đối tượng bộ lọc.Filter Objects.

Bạn không cần phải luôn gọi các phương thức này trên mọi logger bạn tạo. Xem hai đoạn cuối cùng trong phần này.

Với đối tượng logger được định cấu hình, các phương thức sau tạo thông báo nhật ký:

  • logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
    
    7,
    logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
    
    8,
    logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
    
    9,
    # 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()
    
    0 và
    # 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()
    
    1 đều tạo bản ghi nhật ký với một thông báo và mức 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 là
    # 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()
    
    2,
    # 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()
    
    3,
    # 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()
    
    4, v.v. Phần còn lại của các đối số của họ là một danh sách các đối tượng tương ứng với các trường thay thế trong tin nhắn. Liên quan đến
    # 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()
    
    5, các phương thức khai thác chỉ quan tâm đến từ khóa của
    # 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()
    
    6 và sử dụng nó để xác định xem có đăng nhập thông tin ngoại lệ hay không.

  • # 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()
    
    7 Tạo một thông báo nhật ký tương tự 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()
    
    0. Sự khác biệt là
    # 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()
    
    7 bỏ 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 người xử lý ngoại lệ.

  • import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    00 lấy một mức nhật ký làm đối số rõ ràng. Đây là một chút dài dòng cho các tin nhắn ghi nhật ký so với sử dụng các phương thức tiện lợi ở cấp độ nhật ký được liệt kê ở trên, nhưng đây là cách đăng nhập ở các cấp nhật ký tùy chỉnh.

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
01 Trả về một tham chiếu đến một thể hiện logger với tên được chỉ định nếu nó được cung cấp hoặc
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
02 nếu không. Các tên là các cấu trúc phân cấp được phân tách thời kỳ. Nhiều cuộc gọi đến
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
01 có cùng tên sẽ trả về tham chiếu đến cùng một đối tượng logger. Loggers nằm hơn nữa trong danh sách phân cấp là trẻ em của loggers cao hơn trong danh sách. Ví dụ, được đưa ra một logger có tên là
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
04, loggers có tên của
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
05,
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
06 và
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
07 đều là hậu duệ của
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
04.

Loggers có một khái niệm về mức độ hiệu quả. Nếu một cấp độ không được đặt rõ ràng trên logger, mức độ của cha mẹ được sử dụng thay vào đó làm mức hiệu quả. Nếu cha mẹ không có cấp cấp rõ ràng, cha mẹ của nó được kiểm tra, v.v. - tất cả các tổ tiên được tìm kiếm cho đến khi tìm thấy cấp độ được thiết lập rõ ràng. Logger gốc luôn có một mức cấp rõ ràng (theo mặc định ____46). Khi quyết định có xử lý một sự kiện hay không, mức độ hiệu quả của logger được sử dụng để xác định xem sự kiện có được chuyển cho trình xử lý logger hay không.

Những người đăng nhập trẻ em tuyên truyền các thông điệp lên đến những người xử lý liên quan đến loggers tổ tiên của họ. Bởi vì điều này, 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 loggers mà ứng dụng sử dụng. Nó là đủ để định cấu hình trình xử lý cho một bộ ghi cấp cấp cao nhất và tạo bộ ghi nhật ký con khi cần thiết. .

Người xử lý và

Các đối tượng

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
11 chịu trách nhiệm gửi các tin nhắn nhật ký thích hợp (dựa trên thông báo nhật ký Mức độ nghiêm trọng) đến đích đến Handler. Các đối tượng
getattr(logging, loglevel.upper())
6 có thể thêm các đối tượng xử lý bằng 0 hoặc nhiều hơn với phương thức
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
13. Là một kịch bản ví dụ, một ứng dụng có thể muốn gửi tất cả các thông báo nhật ký đến tệp nhật ký, tất cả các thông báo nhật ký lỗi hoặc cao hơn cho stdout và tất cả các thông báo quan trọng đến địa chỉ email. Kịch bản này yêu cầu ba trình xử lý riêng lẻ trong đó mỗi người xử lý chịu trách nhiệm gửi tin nhắn về mức độ nghiêm trọng cụ thể đến một địa điểm cụ thể.

Thư viện tiêu chuẩn bao gồm khá nhiều loại xử lý (xem Trình xử lý hữu ích); Các hướng dẫn sử dụng chủ yếu là

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
14 và
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
15 trong các ví dụ của nó.Useful Handlers); the tutorials use mainly
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
14 and
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
15 in its examples.

Có rất ít phương pháp trong một người xử lý cho các nhà phát triển ứng dụng quan tâm đến bản thâ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 xử lý tích hợp (nghĩa là không tạo trình xử lý tùy chỉnh) là các phương thức cấu hình sau:

  • Phương pháp

    import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    16, 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
    import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    16? Mức được đặt trong logger xác định mức độ nghiêm trọng của tin nhắn mà nó sẽ chuyển cho người xử lý. Cấp độ được đặt trong mỗi người xử lý xác định tin nhắn mà Handler sẽ gửi.

  • import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    18 chọn một đối tượng định dạng cho người xử lý này sử dụng.

  • import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    19 và
    import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    20 Cấu hình và cấu hình các đối tượng bộ lọc trên trình xử lý.

Mã ứng dụng không nên trực tiếp khởi tạo và sử dụng các trường hợp là

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
11. Thay vào đó, lớp
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
11 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 đè).

Định dạng

Các đối tượng Formatter đị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 nhật ký. Không giống như lớp cơ sở ____123, mã ứng dụng có thể khởi tạo các lớp định dạng, mặc dù bạn có thể phân lớp định dạng nếu ứng dụng của bạn cần hành vi đặc biệt. Trình xây dựng có ba đối số tùy chọn - chuỗi định dạng tin nhắn, chuỗi định dạng ngày và chỉ báo kiểu.

logging.formatter .__ init __ (fmt = none, datefmt = none, style = '%') ¶__init__(fmt=None, datefmt=None, style='%')

Nếu không có chuỗi định dạng tin nhắn, mặc định là sử dụng thông báo RAW. Nếu không có chuỗi định dạng ngày, định dạng ngày mặc định là:

với các mili giây đã được giải quyết vào cuối.

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
24 là một trong
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
25,
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
26 hoặc
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
27. Nếu một trong số này không được chỉ định, thì
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
25 sẽ được sử dụng.

Nếu

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
24 là
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
25, chuỗi định dạng thông báo sử dụng
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
31 Thay thế chuỗi theo kiểu; Các khóa có thể được ghi lại trong các thuộc tính logrecord. Nếu kiểu là
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
26, chuỗi định dạng thông báo được giả sử là tương thích với
getattr(logging, loglevel.upper())
1 (sử dụng các đối số từ khóa), trong khi nếu kiểu này là
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
27 thì chuỗi định dạng thông báo sẽ phù hợp với những gì được mong đợi bởi
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
35.LogRecord attributes. If the style is
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
26, the message format string is assumed to be compatible with
getattr(logging, loglevel.upper())
1 (using keyword arguments), while if the style is
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
27 then the message format string should conform to what is expected by
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
35.

Đã thay đổi trong phiên bản 3.2: Đã thêm tham số

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
24.Added the
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
24 parameter.

Chuỗi định dạng thông báo sau đây sẽ ghi lại thời gian ở định dạng có thể đọc được của con người, mức độ nghiêm trọng của tin nhắn và nội dung của tin nhắn, theo thứ tự đó:

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
2

Formatters sử dụng chức năng có thể định cấu hình người dùng để chuyển đổi thời gian tạo của bản ghi thành một tuple. Theo mặc định,

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
37 được sử dụng; Để thay đổi điều này cho một thể hiện định dạng cụ thể, hãy đặt thuộc tính
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
38 của phiên bản thành hàm có cùng chữ ký với
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
37 hoặc
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
40. Để thay đổi nó cho tất cả các định dạng, ví dụ, nếu bạn muốn tất cả thời gian đăng nhập được hiển thị trong GMT, hãy đặt thuộc tính
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
38 trong lớp định dạng (thành
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
42 cho hiển thị 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 đăng nhập theo ba cách:

  1. Tạo loggers, trình xử lý và định dạng 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 hàm

    import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    43.

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

    import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    44.

Đối với tài liệu tham khảo về hai tùy chọn cuối cùng, xem các chức năng cấu hình. Ví dụ sau đây định cấu hình một bộ ghi âm rất đơn giản, trình xử lý bảng điều khiển và một định dạng đơn giản bằng cách sử dụng mã Python:Configuration functions. The following example configures a very simple logger, a console handler, and a simple formatter using Python code:

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
3

Chạy mô -đun này từ dòng lệnh tạo ra đầu ra sau:

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
4

Mô -đun Python sau đây tạo ra một logger, người xử lý và đị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
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
5

Đây là tệp đăng nhập.conf:

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
6

Đầu ra gần giống với ví dụ không dựa trên tệp-file:

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
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 lợi thế so với cách tiếp cận mã Python, chủ yếu phân tách cấu hình và mã và khả năng của những người không kiểm duyệt để dễ dàng sửa đổi các thuộc tính ghi nhật ký.

Cảnh báo

Hàm

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
43 có tham số mặc định,
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
46, mặc định là
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
47 vì lý do tương thích ngược. Điều này có thể hoặc không phải là những gì bạn muốn, vì nó sẽ gây ra bất kỳ bộ ghi nhật ký không root nào trước khi cuộc gọi
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
43 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
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
10 cho tham số này nếu bạn muốn.

Từ điển được chuyển đến

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
44 cũng có thể chỉ định giá trị boolean với khóa
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
46, nếu không được chỉ định rõ ràng trong từ điển cũng mặc định được hiểu là
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
47. Điều này dẫn đến hành vi phân tích logger được mô tả ở trên, có thể không phải là những gì bạn muốn - trong trường hợp đó, cung cấp chính một cách rõ ràng với giá trị
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
10.

Lưu ý rằng các tên lớp được tham chiếu trong các tệp cấu hình cần phải liên quan đến mô -đun ghi nhật ký hoặc các giá trị tuyệt đối có thể được giải quyết bằng cách sử dụng các cơ chế nhập thông thường. Do đó, bạn có thể sử dụng

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
54 (liên quan đến mô -đun ghi nhật ký) hoặc
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
55 (đối với một lớp được xác định trong gói
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
56 và mô -đun
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
57, trong đó
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
56 có sẵn trên đường dẫn nhập Python).

Trong Python 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 để giữ thông tin cấu hình. Điều này cung cấp một superset của chức năng của cách tiếp cận dựa trên tệp cấu hình được nêu ở trên và là phương thức cấu hình được đề xuất cho các ứng dụng và triển khai mới. Bởi vì một từ điển Python được sử dụng để chứa thông tin cấu hình và vì bạn có thể điền từ điển đó bằng các phương tiện khác nhau, bạn có nhiều tùy chọn hơn cho cấu hình. Ví dụ: bạn có thể sử dụng tệp cấu hình ở định dạng JSON hoặc, nếu bạn có quyền truy cập vào chức năng xử lý YAML, một 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 trong mã Python, nhận nó ở dạng ngâm trên một ổ cắm hoặc sử dụng bất kỳ cách tiếp cận nào có ý nghĩa cho ứng dụng của bạn.

Ở đây, 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
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
8

Để biết thêm thông tin về việc đăng nhập bằng từ điển, hãy xem các chức năng cấu hình.Configuration functions.

Điều gì xảy ra nếu không có cấu hình nào được cung cấp Jo

Nếu không có cấu hình ghi nhật ký được cung cấp, có thể có một tình huống trong đó một sự kiện ghi nhật ký cần phải được đầu ra, nhưng không có người xử lý nào có thể được tìm thấy để xuất hiện 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 của Python trước 3.2, hành vi như sau:

  • Nếu ghi nhật ký.RAISEEXEXTIES là

    import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    10 (chế độ sản xuất), sự kiện này được giảm âm thầm.

  • Nếu ghi nhật ký.raiseexceptions là

    import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    47 (chế độ phát triển), một thông báo ‘không có người xử lý nào có thể được tìm thấy cho logger x.y.z, được in một lần.

Trong Python 3.2 trở lên, hành vi như sau:

  • Sự kiện này là đầu ra bằng cách sử dụng ‘người xử lý cuối cùng, được lưu trữ trong

    import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    61. Trình xử lý nội bộ này không được liên kết với bất kỳ logger nào và hoạt động như
    import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    14 ghi thông báo mô tả sự kiện vào giá trị hiện tại của
    # 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, ...)
    
    8 (do đó tôn trọng bất kỳ chuyển hướng nào có thể có hiệu lực). Không có định dạng nào được thực hiện trên tin nhắn - chỉ là thông báo mô tả sự kiện trần được in. Cấp độ Handler được đặt thà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ö')
    
    6, vì vậy tất cả các sự kiện ở mức độ này và mức độ nghiêm trọng lớn hơn sẽ được đầu ra.

Để có được hành vi trước-3.2,

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
61 có thể được đặt thành
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
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 loggers được sử dụng. Một số xem xét cũng cần được cung cấp cho cấu hình ghi nhật ký của nó. Nếu ứng dụng sử dụng không sử dụng ghi nhật ký và mã thư viện thực hiện các cuộc gọi ghi nhật ký, thì (như được mô tả trong phần trước) Các sự kiện về mức độ nghiêm trọ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ö')
6 và lớn hơn sẽ được in thành
# 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, ...)
8. Đây được coi là hành vi mặc định tốt nhất.

Nếu vì một lý do nào đó, bạn không muốn những tin nhắn này được in trong trường hợp không có bất kỳ cấu hình ghi nhật ký nào, bạn có thể đính kèm trình xử lý không làm gì vào bộ ghi cấp cao nhất cho thư viện của bạn. Điều này tránh được thông điệp được in, vì một trình xử lý sẽ luôn được tìm thấy cho các sự kiện thư viện: nó 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 cấp được cấu hình phù hợp thì các cuộc gọi đăng nhập được thực hiện trong mã thư viện sẽ gửi đầu ra cho những người xử lý đó là bình thường.

Một trình xử lý không có gì được bao gồm trong gói ghi nhật ký:

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
69 (kể từ Python 3.1). Một thể hiện của trình xử lý này có thể được thêm vào bộ ghi 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 thư viện của bạn các sự kiện ghi nhật ký được xuất ra
# 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, ...)
8 trong trường hợp không có cấu hình ghi nhật ký). Nếu tất cả việc đăng nhập bởi một thư viện foo được thực hiện bằng cách sử dụng loggers có tên khớp ‘foo.x,‘ foo.x.y, v.v. thì mã:

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
9

Nên có hiệu ứng 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à ‘orgname.foo, chứ không chỉ là‘ foo.

Ghi chú

Chúng tôi khuyên bạn không nên đăng nhập vào logger gốc trong thư viện của mình. Thay vào đó, hãy sử dụng một logger có tên độc đáo và dễ nhận dạng, chẳng hạn như

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
71 cho gói hoặc mô-đun cấp cao nhất của thư viện. Đăng nhập vào logger root sẽ khiến nhà phát triển ứng dụng khó hoặc không thể định cấu hình xác suất ghi nhật ký hoặc trình xử lý thư viện của bạn như họ muốn.

Ghi chú

Chúng tôi khuyên bạn không nên đăng nhập vào logger gốc trong thư viện của mình. Thay vào đó, hãy sử dụng một logger có tên độc đáo và dễ nhận dạng, chẳng hạn như

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
71 cho gói hoặc mô-đun cấp cao nhất của thư viện. Đăng nhập vào logger root sẽ khiến nhà phát triển ứng dụng khó hoặc không thể định cấu hình xác suất ghi nhật ký hoặc trình xử lý thư viện của bạn như họ muốn.

Chúng tôi khuyên bạn không nên thêm bất kỳ trình xử lý nào ngoài import logging from logging.handlers import RotatingFileHandler handlers = [ RotatingFileHandler(filename=logpath+filename, mode='w', maxBytes=512000, backupCount=4) ] logging.basicConfig(handlers=handlers, level=debug_level, format='%(levelname)s %(asctime)s %(message)s', datefmt='%m/%d/%Y%I:%M:%S %p') logger = logging.getLogger('my_logger') 69 vào loggers thư viện của bạ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à những người xử lý thích 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 các bài kiểm tra đơn vị và cung cấp nhật ký phù hợp với yêu cầu của họ.

Mức 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 được quan tâm nếu bạn muốn xác định cấp độ của riêng bạn và cần chúng có các giá trị cụ thể liên quan đến các 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ố, nó sẽ ghi đè lên giá trị được xác định trước; Tên được xác định trước bị mất.

Mứ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ö')
8

50

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

40

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

30

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

20

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

10

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
78

0

Giá trị số

Các cấp độ cũng có thể được liên kết với logger, được đặt bởi nhà phát triển hoặc thông qua việc 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 logger, logger sẽ so sánh mức của chính nó với mức được liên kết với lệnh gọi phương thức. Nếu cấp độ logger cao hơn phương thức gọi, thì không có thông báo ghi nhật ký nào được tạo. Đây là cơ chế cơ bản kiểm soát tính phân từ của đầu ra ghi nhật ký.

Tin nhắn ghi nhật ký được mã hóa dưới dạng các trường hợp của lớp

getattr(logging, loglevel.upper())
5. Khi một logger quyết định thực sự đăng nhập một sự kiện, một thể hiện
getattr(logging, loglevel.upper())
5 được tạo từ thông báo ghi nhật ký.

Giống như đối với loggers, người xử lý có thể có các cấp độ liên quan đến chúng. Một cấp độ Handler, hoạt động như một bộ lọc theo cách tương tự như cấp độ logger. Nếu một người xử lý quyết định thực sự gửi một sự kiện, phương thức

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
86 được sử dụng để gửi tin nhắn đến đích. Hầu hết các lớp con do người dùng xác định của
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
11 sẽ cần phải ghi đè lên
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
86 này.

Cấp độ tùy chỉnh

Xác định cấp độ của riêng bạn là có thể, nhưng không cần thiết, vì các cấp độ hiện tại đã được chọn trên cơ sở kinh nghiệm thực tế. Tuy nhiên, nếu bạn bị thuyết phục rằng bạn cần các cấp độ tùy chỉnh, nên được thực hiện cẩn thận khi làm điều này và có thể là một ý tưởng rất tồi để xác định các cấp tùy chỉnh nếu bạn đang phát triển thư viện. Đó là bởi vì nếu nhiều tác giả thư viện đều xác định các cấp tùy chỉnh của riêng họ, có khả năng đầu ra ghi nhật ký từ nhiều thư viện như vậy được sử dụng cùng nhau sẽ khó sử dụng nhà phát triển để kiểm soát và/hoặc giải thích cho các thư viện khác nhau.

Người xử lý hữu ích

Ngoài lớp cơ sở

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
11, nhiều lớp con hữu ích được cung cấp:

  1. import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    14 Các trường hợp gửi tin nhắn đến các luồng (các đối tượng giống như tệp).

  2. import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    15 Các trường hợp gửi tin nhắn đến các tệp đĩa.

  3. import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    92 là lớp cơ sở cho trình xử lý xoay các 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
    import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    93 hoặc
    import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    94.

  4. import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    93 Các trường hợp gửi tin nhắn đến các tệp đĩa, với sự hỗ trợ cho kích thước tệp nhật ký tối đa và xoay tệp nhật ký.

  5. import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    94 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. import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    97 Các trường hợp gửi tin nhắn đến ổ cắm TCP/IP. Kể từ 3,4, ổ cắm miền UNIX cũng được hỗ trợ.

  7. import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    98 Các trường hợp gửi tin nhắn đến ổ cắm UDP. Kể từ 3,4, ổ cắm miền UNIX cũng được hỗ trợ.

  8. import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    99 Các trường hợp gửi tin nhắn đến một địa chỉ email được chỉ định.

  9. import logging
    from logging.handlers import RotatingFileHandler
         
    logging.basicConfig(filename=logpath+filename, 
           level=debug_level, 
           format='%(levelname)s %(asctime)s %(message)s', 
           datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    logger.addHandler(RotatingFileHandler(
           filename=logpath+filename, 
           mode='w', 
           maxBytes=512000, 
           backupCount=4))
    
    00 Các trường hợp gửi tin nhắn đến trình nền Syslog Unix, có thể trên một máy từ xa.

  10. import logging
    from logging.handlers import RotatingFileHandler
         
    logging.basicConfig(filename=logpath+filename, 
           level=debug_level, 
           format='%(levelname)s %(asctime)s %(message)s', 
           datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    logger.addHandler(RotatingFileHandler(
           filename=logpath+filename, 
           mode='w', 
           maxBytes=512000, 
           backupCount=4))
    
    01 Các trường hợp gửi tin nhắn đến nhật ký sự kiện Windows NT/2000/XP.

  11. import logging
    from logging.handlers import RotatingFileHandler
         
    logging.basicConfig(filename=logpath+filename, 
           level=debug_level, 
           format='%(levelname)s %(asctime)s %(message)s', 
           datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    logger.addHandler(RotatingFileHandler(
           filename=logpath+filename, 
           mode='w', 
           maxBytes=512000, 
           backupCount=4))
    
    02 Các trường hợp gửi tin nhắn đến bộ đệm trong bộ nhớ, được xóa bất cứ khi nào các tiêu chí cụ thể được đáp ứng.

  12. import logging
    from logging.handlers import RotatingFileHandler
         
    logging.basicConfig(filename=logpath+filename, 
           level=debug_level, 
           format='%(levelname)s %(asctime)s %(message)s', 
           datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    logger.addHandler(RotatingFileHandler(
           filename=logpath+filename, 
           mode='w', 
           maxBytes=512000, 
           backupCount=4))
    
    03 Các trường hợp gửi tin nhắn đến máy chủ HTTP bằng cách sử dụng ngữ nghĩa
    import logging
    from logging.handlers import RotatingFileHandler
         
    logging.basicConfig(filename=logpath+filename, 
           level=debug_level, 
           format='%(levelname)s %(asctime)s %(message)s', 
           datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    logger.addHandler(RotatingFileHandler(
           filename=logpath+filename, 
           mode='w', 
           maxBytes=512000, 
           backupCount=4))
    
    04 hoặc
    import logging
    from logging.handlers import RotatingFileHandler
         
    logging.basicConfig(filename=logpath+filename, 
           level=debug_level, 
           format='%(levelname)s %(asctime)s %(message)s', 
           datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    logger.addHandler(RotatingFileHandler(
           filename=logpath+filename, 
           mode='w', 
           maxBytes=512000, 
           backupCount=4))
    
    05.

  13. import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    54 Các trường hợp xem tệp họ đang đăng nhập. Nếu tệp thay đổi, nó được đóng và mở lại bằng tên tệp. Người xử lý này chỉ hữu ích trên các hệ thống giống như Unix; Windows không hỗ trợ cơ chế cơ bản được sử dụng.

  14. import logging
    from logging.handlers import RotatingFileHandler
         
    logging.basicConfig(filename=logpath+filename, 
           level=debug_level, 
           format='%(levelname)s %(asctime)s %(message)s', 
           datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    logger.addHandler(RotatingFileHandler(
           filename=logpath+filename, 
           mode='w', 
           maxBytes=512000, 
           backupCount=4))
    
    07 Các trường hợp gửi tin nhắn đến một hàng đợi, chẳng hạn như các trường hợp được triển khai trong các mô -đun
    import logging
    from logging.handlers import RotatingFileHandler
         
    logging.basicConfig(filename=logpath+filename, 
           level=debug_level, 
           format='%(levelname)s %(asctime)s %(message)s', 
           datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    logger.addHandler(RotatingFileHandler(
           filename=logpath+filename, 
           mode='w', 
           maxBytes=512000, 
           backupCount=4))
    
    08 hoặc
    import logging
    from logging.handlers import RotatingFileHandler
         
    logging.basicConfig(filename=logpath+filename, 
           level=debug_level, 
           format='%(levelname)s %(asctime)s %(message)s', 
           datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    logger.addHandler(RotatingFileHandler(
           filename=logpath+filename, 
           mode='w', 
           maxBytes=512000, 
           backupCount=4))
    
    09.

  15. import logging
    from logging.handlers import RotatingFileHandler
         
    handlers = [ RotatingFileHandler(filename=logpath+filename, 
                mode='w', 
                maxBytes=512000, 
                backupCount=4)
               ]
    logging.basicConfig(handlers=handlers, 
                        level=debug_level, 
                        format='%(levelname)s %(asctime)s %(message)s', 
                        datefmt='%m/%d/%Y%I:%M:%S %p')
         
    logger = logging.getLogger('my_logger')
    
    69 Các 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 ‘không có trình xử lý nào có thể được tìm thấy cho thông báo logger xxx, có thể được hiển thị nếu người dùng thư viện không cấu hình ghi nhật ký. Xem Cấu hình đăng nhập cho một thư viện để biết thêm thông tin.Configuring Logging for a Library for more information.

Các lớp

import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
69,
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
14 và
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
15 được xác định trong gói ghi nhật ký lõi. Các bộ xử lý khác được xác định trong mô-đun phụ,
import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
14. (Ngoài ra còn có một mô hình phụ khác,
import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
15, cho chức năng cấu hình.)

Tin nhắn đã đăng nhập được định dạng để trình bày thông qua các trường hợp của lớp

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
16. 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 tin nhắn trong một đợt, có thể sử dụng các phiên bản

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
17. Ngoài chuỗi định dạng (được áp dụng cho mỗi thông báo trong đợt), còn có điều khoản cho chuỗi định dạng tiêu đề và rơ moóc.

Khi lọc dựa trên cấp độ logger và/hoặc trình xử lý là không đủ, các trường hợp của

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
18 có thể được thêm vào cả hai trường hợp
getattr(logging, loglevel.upper())
6 và
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
11 (thông qua phương thức
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
19 của chúng). Trước khi quyết định xử lý một thông báo thêm, cả loggers và người xử lý đều tham khảo tất cả các bộ lọc của họ để được phép. Nếu bất kỳ bộ lọc nào trả về một giá trị sai, thông báo không được xử lý thêm.

Chức năng

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
18 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 đến logger được đặt tên và con cái của nó được phép thông qua bộ lọc và tất cả các tin nhắn khác đã bị rơi.

Ngoại lệ được nâng lên 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 trong khi đăng nhập vào sản xuất. Điều này là do đó 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ư ghi nhật ký sai, mạng hoặc các lỗi tương tự khác - không khiến ứng dụng sử dụng đăng nhập để chấm dứt sớm.

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
23 và
import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
24 ngoại lệ không bao giờ bị nuốt. Các trường hợp ngoại lệ khác xảy ra trong phương pháp
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
86 của lớp con
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
11 được chuyển sang phương pháp
import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
27 của nó.

Việc triển khai mặc định của

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
27 trong
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
11 kiểm tra xem liệu biến cấp độ mô-đun,
import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
30, có được đặt không. Nếu được đặt, một dấu vết được in thành
# 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, ...)
8. Nếu không được đặt, ngoại lệ bị nuốt.

Ghi chú

Giá trị mặc định của

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
30 là
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
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. Nó khuyên bạn nên đặt
import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
30 thành
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
10 để sử dụng sản xuất.

Sử dụng các đối tượng tùy ý làm tin nhắn lor

Trong các phần trước và ví dụ, người ta đã giả định rằng thông báo được truyền khi đăng nhập 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 thông báo và phương thức

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
36 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 bạn muốn, bạn có thể tránh tính toán hoàn toàn một đại diện chuỗi - ví dụ:
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
97 phát ra một sự kiện bằng cách ngâm nó và gửi nó qua dây.

Tối ưu hóa¶

Định dạng của các đối số tin nhắn đượ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 chuyể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 làm điều đó nếu logger 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

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
38 có đối số cấp độ và trả về đúng nếu sự kiện sẽ được tạo bởi logger cho mức độ gọi đó. Bạn có thể viết mã như thế này:

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
0

Vì vậy, nếu ngưỡng của logger được đặ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ö')
4, các cuộc gọi đến
import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
40 và
import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
41 không bao giờ được thực hiện.

Ghi chú

Giá trị mặc định của

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
30 là
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
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. Nó khuyên bạn nên đặt
import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
30 thành
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
10 để sử dụng sản xuất.

Sử dụng các đối tượng tùy ý làm tin nhắn lor

Trong các phần trước và ví dụ, người ta đã giả định rằng thông báo được truyền khi đăng nhập 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 thông báo và phương thức

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
36 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 bạn muốn, bạn có thể tránh tính toán hoàn toàn một đại diện chuỗi - ví dụ:
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
97 phát ra một sự kiện bằng cách ngâm nó và gửi nó qua dây.

Tối ưu hóa¶

Định dạng của các đối số tin nhắn đượ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 chuyể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 làm điều đó nếu logger 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

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
38 có đối số cấp độ và trả về đúng nếu sự kiện sẽ được tạo bởi logger cho mức độ gọi đó. Bạn có thể viết mã như thế này:

Vì vậy, nếu ngưỡng của logger được đặ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ö')
4, các cuộc gọi đến
import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
40 và
import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
41 không bao giờ được thực hiện.

Trong một số trường hợp,

import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
38 có thể đắt hơn bạn thích (ví dụ: đối với các trình ghi nhật ký được lồng sâu trong đó một mức rõ ràng chỉ được đặt cao trong hệ thống phân cấp logger). 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 cuộc gọi đến
import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
38 trong biến cục bộ hoặc phiên bản và sử dụng nó thay vì gọi phương thức mỗi lần. 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 một cách linh hoạt trong khi ứng dụng đang chạy (không phải là tất cả phổ biến).

Có những 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 ghi nhật ký được thu thập. Dưới đây, một danh sách những điều bạn có thể làm để tránh xử lý trong quá trình đăng nhập 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
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
44 thành
import logging
from logging.handlers import RotatingFileHandler
     
handlers = [ RotatingFileHandler(filename=logpath+filename, 
            mode='w', 
            maxBytes=512000, 
            backupCount=4)
           ]
logging.basicConfig(handlers=handlers, 
                    level=debug_level, 
                    format='%(levelname)s %(asctime)s %(message)s', 
                    datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
66. Điều này tránh gọi
import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
46, có thể giúp tăng tốc mã của bạn trong các môi trường như PYPY (có thể tăng tốc mã tăng tốc sử dụng
import logging
from logging.handlers import RotatingFileHandler
     
logging.basicConfig(filename=logpath+filename, 
       level=debug_level, 
       format='%(levelname)s %(asctime)s %(message)s', 
       datefmt='%m/%d/%Y%I:%M:%S %p')
     
logger = logging.getLogger('my_logger')
logger.addHandler(RotatingFileHandler(
       filename=logpath+filename, 
       mode='w', 
       maxBytes=512000, 
       backupCount=4))
46).

Thông tin luồng.

Làm thế nào để bạn tạo một tệp nhật ký trong Python?

Đây là một ví dụ:..
Nhập nhật ký ghi nhật ký. basicConfig (level = log. ....
Debug: Root: Điều này sẽ được ghi lại ..
Nhập nhật ký ghi nhật ký. basicConfig (fileName = 'app.log', filemode = 'w', format = ' %(name) s - %(levelName) s - %(message) s') ghi nhật ký. ....
Root - Lỗi - Điều này sẽ được đăng nhập vào một tệp ..
Lỗi: Root: Đây là một thông báo lỗi ..

Làm thế nào để bạn ghi lại một bản ghi trong Python?

Những thứ cơ bản..
Tạo và định cấu hình logger. Nó có thể có một số tham số. ....
Ở đây định dạng của logger cũng có thể được đặt. ....
Ngoài ra, mức độ của logger có thể được đặt hoạt động như ngưỡng theo dõi dựa trên các giá trị số được gán cho mỗi cấp độ. ....
Danh sách tất cả các tham số được đưa ra trong Thư viện Python ..

Làm cách nào để viết một tệp nhật ký?

Đây là cách tạo tệp nhật ký trong notepad:..
Chọn Bắt đầu, Nhập Notepad và chọn nó từ kết quả ..
Loại hình .Đăng nhập vào dòng đầu tiên, sau đó nhấn Enter để chuyển sang dòng tiếp theo ..
Trên menu Tệp, nhấp vào Lưu dưới dạng, nhập tên mô tả cho tệp của bạn vào hộp tên tệp, sau đó bấm OK ..

Tệp nhật ký trong Python là gì?

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 tiêu chuẩn có thể cung cấp một khung linh hoạt để phát ra thông điệp nhật ký từ các chương trình Python.Mô-đun này được sử dụng rộng rãi bởi các thư viện và thường là điểm đầu tiên cho hầu hết các nhà phát triển khi ghi nhật ký.