下面我就来详细讲解“Python内置模块logging用法实例分析”的完整攻略。
Python内置模块logging用法实例分析
1. logging模块介绍
logging是Python标准库中专门处理日志信息的模块,提供了各种日志级别,便于开发人员划分不同的日志级别并输出到不同的位置,方便程序调试。
2. logging模块基本使用
logging模块的基本使用总体上分为四步:创建Logger实例、创建Handler实例、创建Formatter实例、将Handler实例添加到Logger实例中。
2.1 创建Logger实例
Logger实例是我们打印日志的实例,有多种方式可以创建Logger实例,这里我们使用logging.getLogger()方法来创建一个Logger实例。logging.getLogger()方法有一个参数name,若传递的name参数不为空则返回名为name的Logger实例对象,若为空则返回root Logger实例对象。一般我们使用root Logger实例对象即可。
import logging
logger = logging.getLogger()
2.2 创建Handler实例
Handler实例决定了日志输出的位置,比如将日志输出到文件还是输出到控制台。常用的两个Handler有:StreamHandler(输出到控制台)和FileHandler(输出到文件),使用方法如下:
import logging
logger = logging.getLogger()
console_handler = logging.StreamHandler() # 输出到控制台
file_handler = logging.FileHandler("log.txt", encoding="utf-8") # 输出到文件
2.3 创建Formatter实例
Formatter实例决定了日志输出的格式,包括日志级别、时间等信息。常用的Formatter有:"%(asctime)s %(levelname)s %(message)s"、"%(asctime)s %(levelname)s %(module)s %(lineno)d %(message)s"等,使用方法如下:
import logging
logger = logging.getLogger()
formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
2.4 添加Handler实例到Logger实例中
最后一步是将Handler实例添加到Logger实例中,使用addHandler()方法进行添加。如果有多个Handler,则会输出到每个Handler实例中。
import logging
logger = logging.getLogger()
console_handler = logging.StreamHandler() # 输出到控制台
file_handler = logging.FileHandler("log.txt", encoding="utf-8") # 输出到文件
formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
logger.addHandler(console_handler) # 将console_handler添加到Logger中
logger.addHandler(file_handler) # 将file_handler添加到Logger中
3. logging模块高级使用
除了上述基本的使用方式外,logging模块还提供了许多高级功能,比如自定义Logger、LoggerAdapter、Filter等。
3.1 自定义Logger
通过自定义Logger,我们可以实现更灵活的日志输出方式。自定义Logger需要继承父类logging.Logger,并且可以针对不同的模块及功能实现不同的Logger实例。
import logging
class MyLogger(logging.Logger):
def __init__(self, name, filepath=None):
super(MyLogger, self).__init__(name)
self.filepath = filepath
if self.filepath:
file_handler = logging.FileHandler(self.filepath, encoding="utf-8")
formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
file_handler.setFormatter(formatter)
self.addHandler(file_handler)
logger = MyLogger("TestLogger1", filepath="log_test1.txt")
3.2 LoggerAdapter
LoggerAdapter用于为Logger实例增加额外的上下文信息,比如新增request id等。
import logging
logger = logging.getLogger()
logger = logging.LoggerAdapter(logger, {'request_id': 'sample-request-id'})
logger.info('test message')
3.3 Filter
Filter用于过滤特定的日志信息,比如我只需要输出warning级别以上的日志。
import logging
class FilterWarning(logging.Filter):
def filter(self, record):
return record.levelno >= logging.WARNING
logger = logging.getLogger()
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s"))
handler.addFilter(FilterWarning()) # 添加Filter
logger.addHandler(handler)
logger.warning("warning message")
logger.info("info message")
4. logging模块示例
下面给出两个logging模块的应用示例,一个输出到控制台,一个输出到文件中:
4.1 示例1:输出到控制台
import logging
logger = logging.getLogger()
console_handler = logging.StreamHandler() # 输出到控制台
formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
logger.debug("debug message")
logger.info("info message")
logger.warning("warning message")
logger.error("error message")
logger.critical("critical message")
4.2 示例2:输出到文件
import logging
logger = logging.getLogger()
file_handler = logging.FileHandler("log.txt", encoding="utf-8", mode="w") # 输出到文件
formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.debug("debug message")
logger.info("info message")
logger.warning("warning message")
logger.error("error message")
logger.critical("critical message")
5. 总结
logging模块是Python标准库中非常重要的日志管理模块,在Python开发中具有重要的作用。本篇介绍了logging模块的基本使用、高级用法以及两个实例,相信读者已经初步了解了logging模块的使用方法,在实际开发中灵活运用logging模块,将可以使你的代码更加优雅。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python内置模块logging用法实例分析 - Python技术站