亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

文件處理程序的日志級別與記錄器的日志級別

文件處理程序的日志級別與記錄器的日志級別

jeck貓 2022-05-19 15:59:12
要在沒有 Python 的情況下 設置日志記錄,basicConfig我們將執行以下步驟:設置文件處理程序。設置文件處理程序的日志記錄級別。設置格式化程序。將文件處理程序指向格式化程序。獲取記錄器對象。設置記錄器對象的記錄級別。將文件處理程序作為處理程序添加到記錄器對象。在記錄器上使用.info(), .warning(), etc 方法。這些步驟由以下代碼執行:import loggingfile_handler = logging.FileHandler('./out.log', 'a')file_handler.setLevel(logging.DEBUG)format_string = '%(asctime)s\t%(levelname)s: %(message)s'formatter = logging.Formatter(format_string)file_handler.setFormatter(formatter)logger = logging.getLogger(__name__)logger.setLevel(logging.DEBUG)logger.addHandler(file_handler)logger.info('visible info')logger.debug('invisible debug')為文件處理程序設置日志記錄級別和為記錄器設置日志記錄級別有什么區別?
查看完整描述

1 回答

?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

好的,所以這里有一小段代碼可以解決:


import logging



# Declare a function to log all 5 levels with different information

def log_all_levels(logger):

    logger.debug("Debug from logger {}".format(logger.name))

    logger.info("Info from logger {}".format(logger.name))

    logger.warning("Warning from logger {}".format(logger.name))

    logger.error("Error from logger {}".format(logger.name))

    logger.critical("Fatal from logger {}".format(logger.name))



# This file handler will track errors from all loggers

all_errors_handler = logging.FileHandler('errors.log')

all_errors_handler.setLevel(logging.ERROR)


# This file handler will only be used in a specific region of code

foo_info_handler = logging.FileHandler('foo_info.log')

foo_info_handler.setLevel(logging.INFO)

foo_info_handler.addFilter(lambda r: r.levelno == logging.INFO)


# The following loggers will be used in the main execution

foo_logger = logging.getLogger("Foo")

nameless_logger = logging.getLogger("nameless")

foo_logger.setLevel(logging.INFO)

nameless_logger.setLevel(logging.DEBUG)

loggers = (foo_logger, nameless_logger)


# Set each logger up to use the file handlers

# Each logger can have many handlers, each handler can be used by many loggers

for logger in loggers:

    logger.addHandler(all_errors_handler)

    debug_file_handler = logging.FileHandler('{}.log'.format(logger.name))

    debug_file_handler.setLevel(logging.DEBUG)

    logger.addHandler(debug_file_handler)

    if logger.name == "Foo":

        logger.addHandler(foo_info_handler)



# Let's run some logging operations

for logger in loggers:

    log_all_levels(logger)

有 2 個記錄器 -foo_logger設置為信息級別并nameless_logger設置為調試級別。他們都使用錯誤和調試處理程序,但只有foo_logger使用foo_file_handler. 現在有不同級別的記錄器和文件處理程序,以多對多的關系連接在一起。

如您所見:

  1. errors.log將包含來自兩個記錄器的錯誤。對于現實生活場景來說,這是不言自明的——閱讀僅包含錯誤的日志有助于調試代碼。

  2. Foo.log并將nameless.log包含有關這些記錄器的所有可能信息,并尊重它們的級別。所以前者將包含信息和更大,而后者將跟蹤調試和更高級別。每個對象的日志記錄可能會創建大量文件,但在嘗試檢測某些特定于對象的錯誤時可能至關重要。

  3. foo_info是一個非常特殊的文件處理程序,它只允許來自關聯記錄器的信息級別。當您輸入潛在的不安全或未經測試的代碼區域并希望查看該代碼塊中究竟發生了什么,而無需瀏覽所有程序日志時,此類文件可以成為救生員。

您還可以使用日志記錄做許多其他事情 - 設置自己的日志記錄規則、創建日志記錄層次結構、創建記錄器工廠 - 可能性是無窮無盡的。日志記錄應該具有靈活性——例如,允許記錄器對象和文件處理程序具有不同且獨立的日志記錄級別,并讓程序員根據需要將它們組合在一起。

我希望小代碼練習和我的解釋可以消除任何進一步的疑問 - 但如果您仍然需要更多示例,我建議您查看Logging Cookbook文檔。



查看完整回答
反對 回復 2022-05-19
  • 1 回答
  • 0 關注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號