在Python编程中,日志记录是一种重要的调试和错误追踪工具。Python的logging模块提供了一种灵活的框架,用于发出日志消息,这些消息可以被发送到各种输出源,如控制台、文件、HTTP GET/POST位置等。本文将深入探讨Python的logging模块,包括其基本用法、高级特性以及如何将其应用到实际项目中。
首先,我们来看一下logging模块的基本用法。logging模块的主要功能是提供一种灵活的框架,用于发出日志消息。这些消息可以被发送到各种输出源,如控制台、文件、HTTP GET/POST位置等。logging模块的核心是Logger类,它提供了应用程序可直接使用的接口。Logger实例化后,可以设置其日志级别(DEBUG, INFO, WARNING, ERROR, CRITICAL),并可以通过其方法来发出日志消息。
例如,以下是一个简单的logging模块的使用示例:
import logging
# 创建一个logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
# 定义handler的输出格式
formatter = logging.Formatter('%(filename)s-%(lineno)d-%(asctime)s-%(levelname)s-%(message)s')
fh.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(fh)
# 记录一条日志
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
在这个示例中,我们首先创建了一个名为’my_logger’的logger,并设置了其日志级别为DEBUG。然后,我们创建了一个handler,用于将日志消息写入到’test.log’文件中。我们还定义了handler的输出格式,包括时间戳、logger的名字、日志级别和日志消息。最后,我们将这个handler添加到logger中,并发出了几条不同级别的日志消息。
除了基本的用法,logging模块还提供了许多高级特性,如过滤器、格式化器、处理器等。过滤器可以根据日志消息的内容或级别来决定是否应该处理这条消息。格式化器可以定义日志消息的输出格式。处理器则负责将日志消息发送到指定的输出源。
例如,以下是如何使用过滤器和格式化器的示例:
import logging
# 创建一个logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
# 创建一个过滤器,只处理INFO级别及以上的日志消息
class MyFilter(logging.Filter):
def filter(self, record):
return record.levelno >= logging.INFO
filter = MyFilter()
fh.addFilter(filter)
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(fh)
# 记录一条INFO级别的日志消息和一条DEBUG级别的日志消息
logger.info('This is an info message')
logger.debug('This is a debug message') # 这条消息不会被处理,因为它的级别低于INFO
在这个示例中,我们首先创建了一个名为’my_logger’的logger,并设置了其日志级别为DEBUG。然后,我们创建了一个handler,用于将日志消息写入到’test.log’文件中。我们还创建了一个过滤器,只处理INFO级别及以上的日志消息。最后,我们将这个handler添加到logger中,并发出了两条不同级别的日志消息。由于我们的过滤器只处理INFO级别及以上的日志消息,所以DEBUG级别的日志消息不会被处理。
如果想被其他模块调用,可以直接封装一个新类new_loging供其他模块调用
import logging
import colorlog
from commond.common_opration import currentTime
from conf.setting import BASE_PATH
def new_loging(log_level="DEBUG"):
# 定义log的颜色
log_colors_config = {
'DEBUG': 'white', # cyan white
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'bold_red',
}
# 定义一个日志收集器
logger = logging.getLogger('ITester')
# 设置收集器的级别,不设定的话,默认收集warning及以上级别的日志
# logger.setLevel('DEBUG')
logger.setLevel(log_level)
# 设置日志格式
# fmt = logging.Formatter('%(filename)s-%(lineno)d-%(asctime)s-%(levelname)s-%(message)s')
# fmt = logging.Formatter('%(asctime)s [%(levelname)s] | %(filename)s:%(lineno)s | %(message)s')
# 文件日志输出格式
file_formatter = logging.Formatter(
fmt='[%(asctime)s.%(msecs)03d] %(filename)s -> %(funcName)s line:%(lineno)d [%(levelname)s] : %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# 控制台日志输出格式
console_formatter = colorlog.ColoredFormatter(
fmt='%(log_color)s[%(asctime)s.%(msecs)03d] %(filename)s -> %(funcName)s line:%(lineno)d [%(levelname)s] : %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
log_colors=log_colors_config
)
# 设置日志处理器-输出到文件
log_file_name = str(currentTime())
file_handler = logging.FileHandler(filename=BASE_PATH+'/log/mylog_'+log_file_name+'.log', mode='a', encoding='utf8')
# print(file_handler)
# 设置日志处理器级别
file_handler.setLevel(log_level)
# 处理器按指定格式输出日志
file_handler.setFormatter(file_formatter)
# 判断当前日志对象中是否有处理器,如果没有,则添加处理器,避免重复打印log
if not logger.handlers:
# 输出到控制台
ch = logging.StreamHandler()
# 设置日志处理器级别
ch.setLevel(log_level)
# 处理器按指定格式输出日志
ch.setFormatter(console_formatter)
# 收集器和处理器对接,指定输出渠道
# 日志输出到文件
logger.addHandler(file_handler)
# 日志输出到控制台
logger.addHandler(ch)
return logger
if __name__ == '__main__':
a = new_loging("DEBUG")
a.info("自定义的info日志")
# logger.debug('自定义的debug日志')
# logger.info('自定义的info日志')
# logger.warning('自定义的warning日志')
# logger.error('自定义的error日志')
# logger.critical('自定义的critical日志')
test. py文件调用
import new_loging
logger = new_loging()
print(logger.info('自定义的info日志')
(本文会继续更新敬请期待)
参考文章来源:https://blog.csdn.net/python_jeff/article/details/135178382