Hướng dẫn how to create log file in python - cách tạo tệp nhật ký trong python

Đăng nhập vào Python rất hiệu quả và dễ sử dụng. Bạn chỉ cần xác định mô -đun Python để ghi nhật ký bằng mô -đun ghi nhật ký nội bộ Python. Bạn có thể xác định bao nhiêu logger tùy thích. Bạn cũng có thể định cấu hình nó để in đầu ra vào bảng điều khiển cũng như ghi vào một tệp. Ngoài ra, bạn có thể xác định một trình xử lý tệp xoay sẽ thực hiện xoay vòng nhật ký cũng giúp trong tự động hóa xoay vòng. Dưới đây là đoạn trích xác định trực tiếp và gọi logger trong bất kỳ mô -đun Python nào.

import sys
import logging
from logging.config import dictConfig

logging_config = dict(
    version=1,
    formatters={
        'verbose': {
            'format': ("[%(asctime)s] %(levelname)s "
                       "[%(name)s:%(lineno)s] %(message)s"),
            'datefmt': "%d/%b/%Y %H:%M:%S",
        },
        'simple': {
            'format': '%(levelname)s %(message)s',
        },
    },
    handlers={
        'api-logger': {'class': 'logging.handlers.RotatingFileHandler',
                           'formatter': 'verbose',
                           'level': logging.DEBUG,
                           'filename': 'logs/api.log',
                           'maxBytes': 52428800,
                           'backupCount': 7},
        'batch-process-logger': {'class': 'logging.handlers.RotatingFileHandler',
                             'formatter': 'verbose',
                             'level': logging.DEBUG,
                             'filename': 'logs/batch.log',
                             'maxBytes': 52428800,
                             'backupCount': 7},
        'console': {
            'class': 'logging.StreamHandler',
            'level': 'DEBUG',
            'formatter': 'simple',
            'stream': sys.stdout,
        },
    },
    loggers={
        'api_logger': {
            'handlers': ['api-logger', 'console'],
            'level': logging.DEBUG
        },
        'batch_process_logger': {
            'handlers': ['batch-process-logger', 'console'],
            'level': logging.DEBUG
        }
    }
)

dictConfig(logging_config)

api_logger = logging.getLogger('api_logger')
batch_process_logger = logging.getLogger('batch_process_logger')

Khi bạn đã xác định tệp này (giả sử logger_sinstall.py), bạn có thể nhập nó ở bất cứ đâu và sử dụng.

from logger_settings import api_logger

api_logger.info('hello world')

Hy vọng điều này giúp đỡ. Cảm ơn

Tác giả

Vinay Sajip

Hướng dẫn ghi nhật ký cơ bản

Ghi nhật ký là một phương tiện để theo dõi các sự kiện xảy ra khi một số phần mềm chạy. Nhà phát triển phần mềm bổ sung các cuộc gọi đăng nhập vào mã của họ để chỉ ra rằng một số sự kiện đã xảy ra. Một sự kiện được mô tả bởi một thông điệp mô tả có thể tùy chọn chứa dữ liệu biến (nghĩa là dữ liệu có khả năng khác nhau cho mỗi lần xuất hiện của sự kiện). Các sự kiện cũng có tầm quan trọng mà nhà phát triển gán cho sự kiện này; Tầm quan trọng cũng có thể được gọi là mức độ hoặc mức độ nghiêm trọng.

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.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,
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,
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 và
import logging
logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
logging.error('And non-ASCII stuff, too, like Øresund and Malmö')
4. Để 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.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

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.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 (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ö')
7 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.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 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ö')
9 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)

DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too
ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö
0,
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ö
1 hoặc
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 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

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ö
3

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

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

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.

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

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.

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ö
7

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à

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, 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

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ö
4 không xuất hiện vì mức mặc định là
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. 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

getattr(logging, loglevel.upper())
1. 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
getattr(logging, loglevel.upper())
1.The encoding argument was added. In earlier Python versions, or if not specified, the encoding used is the default value used by
getattr(logging, loglevel.upper())
1. 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
getattr(logging, loglevel.upper())
1.

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

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ö
3, 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

getattr(logging, loglevel.upper())
4 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

getattr(logging, loglevel.upper())
5 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

getattr(logging, loglevel.upper())
5 sẽ đến trước mọi cuộc gọi đế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ö')
0,
import logging
logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
logging.error('And non-ASCII stuff, too, like Øresund and Malmö')
1, v.v. Nếu không, các chức năng đó sẽ gọi
getattr(logging, loglevel.upper())
5 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()

# mylib.py
import logging

def do_something():
    logging.info('Doing something')

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

from logger_settings import api_logger

api_logger.info('hello world')
0

Đó 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ụ:

from logger_settings import api_logger

api_logger.info('hello world')
1

sẽ hiển thị:

from logger_settings import api_logger

api_logger.info('hello world')
2

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ư

# 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, ...)
0 và
# 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, ...)
1. 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:

from logger_settings import api_logger

api_logger.info('hello world')
3

cái nào sẽ in:

from logger_settings import api_logger

api_logger.info('hello world')
4

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:

from logger_settings import api_logger

api_logger.info('hello world')
5

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

from logger_settings import api_logger

api_logger.info('hello world')
6

Đị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

# 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, ...)
2, 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
# 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, ...)
2, as in this example:

from logger_settings import api_logger

api_logger.info('hello world')
7

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

from logger_settings import api_logger

api_logger.info('hello world')
8

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

# assuming loglevel is bound to the string value obtained from the
# command line argument. Convert to upper case to allow the user to
# specify --log=DEBUG or --log=debug
numeric_level = getattr(logging, loglevel.upper(), None)
if not isinstance(numeric_level, int):
    raise ValueError('Invalid log level: %s' % loglevel)
logging.basicConfig(level=numeric_level, ...)
3.

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ụ

# 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, ...)
4.

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

# 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, ...)
5 (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:

from logger_settings import api_logger

api_logger.info('hello world')
9

Đ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.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,
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,
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 và
import logging
logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
logging.error('And non-ASCII stuff, too, like Øresund and Malmö')
4, 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

getattr(logging, loglevel.upper())
5 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.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,
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,
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 và
import logging
logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
logging.error('And non-ASCII stuff, too, like Øresund and Malmö')
4, họ sẽ kiểm tra xem có đích nào được đặt không; và nếu một người không được đặt, họ sẽ đặt đích của bảng điều khiển (
logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
7) 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

getattr(logging, loglevel.upper())
5 cho tin nhắ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
0

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

getattr(logging, loglevel.upper())
5 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 to create log file in python - cách tạo tệp nhật ký trong python

Người khai thác gỗ¶

# 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, ...)
5 Đố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:

  • # 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 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.

  • # 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 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()
    
    3 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.

  • # 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à
    # 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 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ý:

  • # 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,
    # 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,
    # 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()
    
    8,
    # 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()
    
    9 và
    # mylib.py
    import logging
    
    def do_something():
        logging.info('Doing something')
    
    0 đều tạo bản ghi nhật ký với một thông báo và cấp độ tương ứng với tên phương thức tương ứng của chúng. Thông báo thực sự là một chuỗi định dạng, có thể chứa cú pháp thay thế chuỗi tiêu chuẩn là
    # mylib.py
    import logging
    
    def do_something():
        logging.info('Doing something')
    
    1,
    # mylib.py
    import logging
    
    def do_something():
        logging.info('Doing something')
    
    2,
    # mylib.py
    import logging
    
    def do_something():
        logging.info('Doing something')
    
    3, 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
    # mylib.py
    import logging
    
    def do_something():
        logging.info('Doing something')
    
    4, các phương thức khai thác chỉ quan tâm đến từ khóa của
    # mylib.py
    import logging
    
    def do_something():
        logging.info('Doing something')
    
    5 và sử dụng nó để xác định xem có đăng nhập thông tin ngoại lệ hay không.

  • # mylib.py
    import logging
    
    def do_something():
        logging.info('Doing something')
    
    6 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()
    
    9. Sự khác biệt là
    # mylib.py
    import logging
    
    def do_something():
        logging.info('Doing something')
    
    6 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ệ.

  • # mylib.py
    import logging
    
    def do_something():
        logging.info('Doing something')
    
    9 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.

from logger_settings import api_logger

api_logger.info('hello world')
00 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
from logger_settings import api_logger

api_logger.info('hello world')
01 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
from logger_settings import api_logger

api_logger.info('hello world')
00 có cùng tên sẽ trả về một 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à
from logger_settings import api_logger

api_logger.info('hello world')
03, loggers có tên của
from logger_settings import api_logger

api_logger.info('hello world')
04,
from logger_settings import api_logger

api_logger.info('hello world')
05 và
from logger_settings import api_logger

api_logger.info('hello world')
06 đều là hậu duệ của
from logger_settings import api_logger

api_logger.info('hello world')
03.

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 (

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 theo mặc định). Khi quyết định có xử lý một sự kiện hay không, mức độ hiệu quả của 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

from logger_settings import api_logger

api_logger.info('hello world')
10 chịu trách nhiệm gửi các thông báo nhật ký thích hợp (dựa trên thông báo nhật ký Mức độ nghiêm trọng) đối với điểm đến được chỉ định của Handler.
# 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, ...)
5 Các đối tượng có thể thêm các đối tượng xử lý bằng không hoặc nhiều hơn với phương thức
from logger_settings import api_logger

api_logger.info('hello world')
12. 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à

from logger_settings import api_logger

api_logger.info('hello world')
13 và
from logger_settings import api_logger

api_logger.info('hello world')
14 trong các ví dụ của nó.Useful Handlers); the tutorials use mainly
from logger_settings import api_logger

api_logger.info('hello world')
13 and
from logger_settings import api_logger

api_logger.info('hello world')
14 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

    from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    15, 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
    from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    15? 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.

  • from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    17 chọn một đối tượng định dạng cho người xử lý này sử dụng.

  • from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    18 và
    from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    19 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à

from logger_settings import api_logger

api_logger.info('hello world')
10. Thay vào đó, lớp
from logger_settings import api_logger

api_logger.info('hello world')
10 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ở ____122, 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.

from logger_settings import api_logger

api_logger.info('hello world')
23 là một trong số
from logger_settings import api_logger

api_logger.info('hello world')
24,
from logger_settings import api_logger

api_logger.info('hello world')
25 hoặc
from logger_settings import api_logger

api_logger.info('hello world')
26. Nếu một trong số này không được chỉ định, thì
from logger_settings import api_logger

api_logger.info('hello world')
24 sẽ được sử dụng.

Nếu

from logger_settings import api_logger

api_logger.info('hello world')
23 là
from logger_settings import api_logger

api_logger.info('hello world')
24, chuỗi định dạng thông báo sử dụng thay thế chuỗi kiểu
from logger_settings import api_logger

api_logger.info('hello world')
30; Các khóa có thể được ghi lại trong các thuộc tính logrecord. Nếu kiểu là
from logger_settings import api_logger

api_logger.info('hello world')
25, chuỗi định dạng thông báo được giả sử là tương thích với
# 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, ...)
0 (sử dụng các đối số từ khóa), trong khi nếu kiểu này là
from logger_settings import api_logger

api_logger.info('hello world')
26 thì chuỗi định dạng thông báo sẽ phù hợp với những gì được mong đợi bởi
from logger_settings import api_logger

api_logger.info('hello world')
34.LogRecord attributes. If the style is
from logger_settings import api_logger

api_logger.info('hello world')
25, the message format string is assumed to be compatible with
# 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, ...)
0 (using keyword arguments), while if the style is
from logger_settings import api_logger

api_logger.info('hello world')
26 then the message format string should conform to what is expected by
from logger_settings import api_logger

api_logger.info('hello world')
34.

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

from logger_settings import api_logger

api_logger.info('hello world')
23.Added the
from logger_settings import api_logger

api_logger.info('hello world')
23 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
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
1

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,

from logger_settings import api_logger

api_logger.info('hello world')
36 đượ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
from logger_settings import api_logger

api_logger.info('hello world')
37 của phiên bản thành hàm có cùng chữ ký với
from logger_settings import api_logger

api_logger.info('hello world')
36 hoặc
from logger_settings import api_logger

api_logger.info('hello world')
39. Để 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
from logger_settings import api_logger

api_logger.info('hello world')
37 trong lớp định dạng (thành
from logger_settings import api_logger

api_logger.info('hello world')
41 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

    from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    42.

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

    from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    43.

Đố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
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
2

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

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

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

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

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

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

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

from logger_settings import api_logger

api_logger.info('hello world')
42 có tham số mặc định,
from logger_settings import api_logger

api_logger.info('hello world')
45, mặc định là
from logger_settings import api_logger

api_logger.info('hello world')
46 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
from logger_settings import api_logger

api_logger.info('hello world')
42 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
from logger_settings import api_logger

api_logger.info('hello world')
09 cho tham số này nếu bạn muốn.

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

from logger_settings import api_logger

api_logger.info('hello world')
43 cũng có thể chỉ định giá trị boolean với khóa
from logger_settings import api_logger

api_logger.info('hello world')
45, nếu không được chỉ định rõ ràng trong từ điển cũng mặc định được hiểu là
from logger_settings import api_logger

api_logger.info('hello world')
46. Đ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ị
from logger_settings import api_logger

api_logger.info('hello world')
09.

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

from logger_settings import api_logger

api_logger.info('hello world')
53 (liên quan đến mô -đun ghi nhật ký) hoặc
from logger_settings import api_logger

api_logger.info('hello world')
54 (đối với một lớp được xác định trong gói
from logger_settings import api_logger

api_logger.info('hello world')
55 và mô -đun
from logger_settings import api_logger

api_logger.info('hello world')
56, trong đó
from logger_settings import api_logger

api_logger.info('hello world')
55 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
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
7

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

    from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    09 (chế độ sản xuất), sự kiện này được giảm âm thầm.

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

    from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    46 (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 một người xử lý cuối cùng, được lưu trữ trong

    from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    60. 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ư
    from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    13 ghi thông báo mô tả sự kiện vào giá trị hiện tại của
    logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
    
    7 (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
    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, 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,

from logger_settings import api_logger

api_logger.info('hello world')
60 có thể được đặt thành
from logger_settings import api_logger

api_logger.info('hello world')
65.

Đị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

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 và lớn hơn sẽ được in thành
logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
7. Đâ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ý:

from logger_settings import api_logger

api_logger.info('hello world')
68 (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
logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
7 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
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
8

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ư

from logger_settings import api_logger

api_logger.info('hello world')
70 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ư

from logger_settings import api_logger

api_logger.info('hello world')
70 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.

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 độ

Giá trị số

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ö
7

50

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

40

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

30

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ö
4

20

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ö
3

10

from logger_settings import api_logger

api_logger.info('hello world')
77

0

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

# 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, ...)
4. Khi một logger quyết định thực sự đăng nhập một sự kiện, một thể hiệ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, ...)
4 được tạo từ thông báo ghi nhật ký.

Tin nhắn ghi nhật ký phải tuân theo một cơ chế điều phối thông qua việc sử dụng trình xử lý, đó là các trường hợp của các lớp con của lớp

from logger_settings import api_logger

api_logger.info('hello world')
10. Người xử lý chịu trách nhiệm đảm bảo rằng một tin nhắn đã đăng nhập (dưới dạng
# 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, ...)
4) kết thúc ở một vị trí cụ thể (hoặc tập hợp các vị trí) hữu ích cho đối tượng mục tiêu cho thông báo đó (như người dùng cuối, nhân viên bàn hỗ trợ, hệ thống Quản trị viên, nhà phát triển). Người xử lý được thông qua
# 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, ...)
4 trường hợp dành cho các điểm đến cụ thể. Mỗi logger có thể có số 0, một hoặc nhiều trình xử lý được liên kết với nó (thông qua phương pháp
from logger_settings import api_logger

api_logger.info('hello world')
12 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, ...)
5). Ngoài bất kỳ trình xử lý nào được liên kết trực tiếp với logger, tất cả các trình xử lý được liên kết với tất cả các tổ tiên của logger được gọi để gửi tin nhắn (trừ khi cờ truyền cho logger được đặt thành giá trị sai, tại điểm chuyển đến người xử lý tổ tiên dừng lại ).

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

from logger_settings import api_logger

api_logger.info('hello world')
85 đượ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
from logger_settings import api_logger

api_logger.info('hello world')
10 sẽ cần ghi đè lên
from logger_settings import api_logger

api_logger.info('hello world')
85 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ở

from logger_settings import api_logger

api_logger.info('hello world')
10, nhiều lớp con hữu ích được cung cấp:

  1. from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    13 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. from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    14 Các trường hợp gửi tin nhắn đến các tệp đĩa.

  3. from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    91 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
    from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    92 hoặc
    from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    93.

  4. from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    92 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. from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    93 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. from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    96 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. from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    97 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. from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    98 Các trường hợp gửi tin nhắn đến một địa chỉ email được chỉ định.

  9. from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    99 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
    logging.warning('Watch out!')  # will print a message to the console
    logging.info('I told you so')  # will not print anything
    
    00 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
    logging.warning('Watch out!')  # will print a message to the console
    logging.info('I told you so')  # will not print anything
    
    01 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
    logging.warning('Watch out!')  # will print a message to the console
    logging.info('I told you so')  # will not print anything
    
    02 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
    logging.warning('Watch out!')  # will print a message to the console
    logging.info('I told you so')  # will not print anything
    
    03 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
    
    04.

  13. from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    53 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
    logging.warning('Watch out!')  # will print a message to the console
    logging.info('I told you so')  # will not print anything
    
    06 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
    logging.warning('Watch out!')  # will print a message to the console
    logging.info('I told you so')  # will not print anything
    
    07 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
    
    08.

  15. from logger_settings import api_logger
    
    api_logger.info('hello world')
    
    68 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

from logger_settings import api_logger

api_logger.info('hello world')
68,
from logger_settings import api_logger

api_logger.info('hello world')
13 và
from logger_settings import api_logger

api_logger.info('hello world')
14 đượ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
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
13. (Ngoài ra còn có một mô hình phụ khác,
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
14, cho chức năng cấu hình.)

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

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
15. 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 lô, các phiên bả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
16 có thể được sử dụng. 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
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
17 có thể được thêm vào cả hai trường hợp
# 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, ...)
5 và
from logger_settings import api_logger

api_logger.info('hello world')
10 (thông qua phương thức
from logger_settings import api_logger

api_logger.info('hello world')
18 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
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
17 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
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
22 và
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
23 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
from logger_settings import api_logger

api_logger.info('hello world')
85 của lớp con
from logger_settings import api_logger

api_logger.info('hello world')
10 được chuyển sang phương pháp
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
26 của nó.

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

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

api_logger.info('hello world')
10 kiểm tra xem liệu biến cấp độ mô-đun,
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
29, có được đặt không. Nếu được đặt, một dấu vết được in thành
logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
7. Nếu không được đặt, ngoại lệ bị nuốt.

Ghi chú

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

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
29 là
from logger_settings import api_logger

api_logger.info('hello world')
46. Đ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
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
29 thành
from logger_settings import api_logger

api_logger.info('hello world')
09 để 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
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
35 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ụ:
from logger_settings import api_logger

api_logger.info('hello world')
96 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
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
37 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
9

Vì vậy, nếu ngưỡng của logger được đặt ở trê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ö
3, các 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
39 và
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
40 không bao giờ được thực hiện.

Ghi chú

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

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
29 là
from logger_settings import api_logger

api_logger.info('hello world')
46. Đ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
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
29 thành
from logger_settings import api_logger

api_logger.info('hello world')
09 để 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
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
35 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ụ:
from logger_settings import api_logger

api_logger.info('hello world')
96 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
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
37 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:

Đặt

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
43 thành
from logger_settings import api_logger

api_logger.info('hello world')
65. Điều này tránh gọi
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
45, 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
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
45).

Thông tin luồng.

Đặt

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
47 thành
from logger_settings import api_logger

api_logger.info('hello world')
09.

ID quy trình hiện tại (

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

Đặt

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
50 thành
from logger_settings import api_logger

api_logger.info('hello world')
09.

Tên quy trình hiện tại khi sử dụng

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
08 để quản lý nhiều quy trình.

Đặt

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
53 thành
from logger_settings import api_logger

api_logger.info('hello world')
09.

Cũng lưu ý rằng mô -đun ghi nhật ký lõi chỉ bao gồm các trình xử lý cơ bản. Nếu bạn không nhập khẩu

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
13 và
import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything
14, họ đã giành được bất kỳ bộ nhớ nào.

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

Python có ghi nhật ký mô-đun tích hợp cho phép viết các thông báo trạng thái vào tệp hoặc bất kỳ luồng đầu ra nào khác. Tệp có thể chứa thông tin về phần của mã được thực thi và vấn đề nào đã được phát sinh.allows writing status messages to a file or any other output streams. The file can contain the information on which part of the code is executed and what problems have been arisen.

Có nhật ký trong Python không?

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ý. that can provide a flexible framework for emitting log messages from Python programs. This module is widely used by libraries and is often the first go-to point for most developers when it comes to logging.