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. 現在有不同級別的記錄器和文件處理程序,以多對多的關系連接在一起。
如您所見:
errors.log
將包含來自兩個記錄器的錯誤。對于現實生活場景來說,這是不言自明的——閱讀僅包含錯誤的日志有助于調試代碼。Foo.log
并將nameless.log
包含有關這些記錄器的所有可能信息,并尊重它們的級別。所以前者將包含信息和更大,而后者將跟蹤調試和更高級別。每個對象的日志記錄可能會創建大量文件,但在嘗試檢測某些特定于對象的錯誤時可能至關重要。foo_info
是一個非常特殊的文件處理程序,它只允許來自關聯記錄器的信息級別。當您輸入潛在的不安全或未經測試的代碼區域并希望查看該代碼塊中究竟發生了什么,而無需瀏覽所有程序日志時,此類文件可以成為救生員。
您還可以使用日志記錄做許多其他事情 - 設置自己的日志記錄規則、創建日志記錄層次結構、創建記錄器工廠 - 可能性是無窮無盡的。日志記錄應該具有靈活性——例如,允許記錄器對象和文件處理程序具有不同且獨立的日志記錄級別,并讓程序員根據需要將它們組合在一起。
我希望小代碼練習和我的解釋可以消除任何進一步的疑問 - 但如果您仍然需要更多示例,我建議您查看Logging Cookbook或文檔。
添加回答
舉報