Python中logger日志模块详解
1. 为什么需要日志模块?
在编写代码时,有时候需要打印一些调试信息或者输出一些运行结果,以便于程序员进行调试和定位错误。在小规模的项目中,可以直接使用print函数进行输出。但是,在大规模的项目中,使用print容易造成输出信息泛滥,难以定位问题。此时,就需要使用专业的日志模块来管理输出信息。
Python标准库内置了logging模块,通过logging可以实现记录程序运行过程中的信息并提供多种输出方式,如:输出到终端、输出到文件等。
2. 如何使用日志模块?
2.1 logging模块的基本使用
使用logging模块前需要先导入该模块:
import logging
接下来,我们可以使用logging模块的一些函数来记录日志信息,如下所示:
# 输出到控制台
logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')
在使用logging模块输出日志信息时,是按照严重程度依次递增的,从低到高一共分为5个等级:DEBUG、INFO、WARNING、ERROR、CRITICAL。其中,DEBUG级别的信息最为详细,而CRITICAL级别的信息最为严重。
2.2 配置logging模块
通过上面的示例,我们可以很轻松地使用logging模块输出日志信息到终端。但是,在实际应用中,为提高代码的可维护性和重用性,我们通常需要通过logging模块的配置功能,来将不同的日志输出到不同的位置,或者根据不同的需求输出不同级别的信息。下面,我们将介绍一些常用的logging模块配置:
2.2.1 设置日志级别
通过logging模块的basicConfig函数,可以设置日志级别,从而限制输出的信息等级:
import logging
# 设置日志级别
logging.basicConfig(level=logging.DEBUG)
上述代码将设置日志级别为DEBUG,这意味着所有大于等于该级别的信息都将被输出。
如果想设置为输出所有日志信息,则可以使用如下代码:
# 输出所有日志信息
logging.basicConfig(level=logging.NOTSET)
2.2.2 指定输出格式
通过logging模块的basicConfig函数,还可以设置输出日志的格式和内容,常用的占位符如下所示:
占位符 | 描述 |
---|---|
%(name)s | 日志名称 |
%(levelname)s | 日志级别 |
%(asctime)s | 日志创建时间 |
%(message)s | 日志信息 |
%(filename)s | 日志文件名 |
%(funcName)s | 日志记录函数名 |
%(lineno)d | 日志记录行号 |
%(pathname)s | Python文件的完整路径,包括文件名 |
%(thread)d | 线程ID |
示例代码如下:
import logging
logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info('This is an info message')
上述代码中,我们将日志输出格式设置为:
2018-08-27 15:06:12,058 - INFO - __main__ - This is an info message
2.2.3 将日志输出到文件
通过设置输出日志的filename参数,可以将日志输出到文件中,示例代码如下:
import logging
logging.basicConfig(filename='example.log', format='%(asctime)s - %(levelname)s - %(name)s - %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info('This is an info message')
上述代码将日志输出到了example.log文件中。
2.3 logging模块的高级使用
上述介绍了logging模块的基本使用和常用配置,接下来我们将介绍logging模块的高级用法,包括使用日志处理器和日志过滤器。
2.3.1 使用日志处理器
日志处理器用于指定日志输出的位置,logging模块内置的日志处理器有:StreamHandler、FileHandler、RotatingFileHandler以及SocketHandler等。
# 输出到控制台
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)
stream_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
stream_handler.setFormatter(stream_formatter)
# 输出到文件
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.ERROR)
file_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
file_handler.setFormatter(file_formatter)
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(stream_handler)
logger.addHandler(file_handler)
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')
上述代码将日志输出到了控制台和example.log两个位置,并使用不同的日志处理器设置了不同的输出级别和输出格式。
2.3.2 使用日志过滤器
日志过滤器用于根据指定的条件过滤需要进行日志输出的消息,logging模块内置的日志过滤器有:Filter、LogRecord属性过滤器以及其他各种类型的过滤器。
# 筛选出日志消息中包含error关键字的消息
class ErrorFilter(logging.Filter):
def filter(self, record):
return record.levelno == logging.ERROR and 'error' in record.msg
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)
stream_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
stream_handler.setFormatter(stream_formatter)
stream_handler.addFilter(ErrorFilter())
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.ERROR)
file_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
file_handler.setFormatter(file_formatter)
logger.addHandler(stream_handler)
logger.addHandler(file_handler)
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')
logger.error('This is another error.')
上述代码将只输出包含error关键字的日志消息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python中logger日志模块详解 - Python技术站