Python logging模块的使用详解
什么是logging模块
Python的logging模块提供了大量的灵活方式记录程序运行时产生的信息,包括日志级别、输出位置、日志文件格式等。
利用logging模块可以高效的管理日志,对于排查问题和系统运维等方面非常重要。
logging模块的使用方法
logging模块主要包括四个组件:Logger, Handler, Filter, Formatter。
- Logger: 定义了日志产生的地方,也可以设置多个Logger之间的层级关系。
- Handler: 定义了日志将输出到哪里,例如控制台、日志文件等。
- Filter: 可以更细致的过滤日志输出。
- Formatter: 定义了日志的输出格式。
下面分别对这四个组件进行详细的说明。
Logger
Logger是日志记录器,统筹其他三个组件的工作。
对于每个Logger,在进行日志记录时,都需要有一个名字。名字的设定按层级结构设定,例如 app.module1.module2 就对应着一个层级结构。
import logging
logger = logging.getLogger(__name__) # 获取一个Logger实例
logger.setLevel(logging.DEBUG) # 设置logging的最低日志级别为DEBUG
Logger对象提供了6个记录日志的方法:debug(), info(), warning(), error(), critical(), log()。其中log()可以灵活引用其他5个方法来记录日志。
logger.debug("This is a debug level message.") # 记录Debug信息
logger.info("This is an info level message.") # 记录Info信息
logger.warning("This is a warning level message.") # 记录Warning信息
logger.error("This is an error level message.") # 记录Error信息
logger.critical("This is a critical level message.") # 记录Critical信息
Handler
Handler是日志处理器,可以将Logger产生的日志输出到多个位置。比较常见的有:控制台、文件、SMTP等。
下面是把日志记录到控制台的例子:
import logging
logger = logging.getLogger()
console_handler = logging.StreamHandler() # 创建一个输出到控制台的Handler
console_handler.setLevel(logging.DEBUG) # 设置Handler的日志级别为DEBUG
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 设置日志输出格式
console_handler.setFormatter(formatter) # 把Formatter和Handler结合起来
logger.addHandler(console_handler) # 把Handler加到Logger中
logger.info("This is an info level message for console.") # 记录Info信息并输出到控制台
Filter
Filter用于对日志进行过滤。
import logging
class InfoFilter(logging.Filter):
def filter(self, record):
return record.levelno == logging.INFO # 只保留Level为INFO的日志信息
logger = logging.getLogger()
handler = logging.StreamHandler()
handler.addFilter(InfoFilter()) # 过滤日志输出
logger.addHandler(handler)
logger.info('This is an info message.')
logger.debug('This is a debug message.')
Formatter
Formatter定义了日志的输出格式。
import logging
logger = logging.getLogger()
handler = logging.StreamHandler()
# 设置日志输出格式
formatter = logging.Formatter('[%(asctime)s] [%(levelname)s] [%(name)s] - %(message)s')
handler.setFormatter(formatter) # 把格式加到Handler中
logger.addHandler(handler)
logger.info('This is an info message.')
logger.debug('This is a debug message.')
示例
下面通过两个示例分别说明如何把日志保存到文件和如何把日志从多个模块记录到一个文件。
把日志保存到文件
import logging
logger = logging.getLogger()
handler = logging.FileHandler(filename='log.txt', encoding='utf-8')
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('[%(asctime)s] [%(levelname)s] [%(name)s] - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("This is an info level message for file.")
把日志从多个模块记录到一个文件
在多模块开发时,如果想要把日志记录到一个文件中,需要使用logging的父子logger结构。
- 父Logger负责设置日志输出的最低级别,以及提供一个共享的Handler。
- 不同的子Logger可以设置不同的日志输出等级,然后通过使用父Logger的共享Handler输出日志。
# 父Logger
import logging
logger = logging.getLogger()
handler = logging.FileHandler(filename='log.txt', encoding='utf-8')
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('[%(asctime)s] [%(levelname)s] [%(name)s] - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
# 子Logger
import logging
from parent_module import logger
child_logger = logging.getLogger(__name__)
child_logger.setLevel(logging.DEBUG)
child_logger.addHandler(logger.handlers[0])
child_logger.debug("This is a debug message from child module.")
以上就是关于Python logging模块的使用详解的内容,包括了4个组件的简要介绍、示例说明两个常用场景,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python logging模块的使用详解 - Python技术站