一、Python中的日志模块
Python的标准库中拥有一个日志模块logging
,它提供了非常强大的日志处理功能,可以根据各自的需求来灵活配置日志记录的级别、输出格式、输出位置、日志轮换等等。通过logging
模块,我们可以方便地将应用程序中的各种调试信息、错误信息、警告信息等进行统一地记录和管理。
import logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
if __name__ == '__main__':
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
上述代码中,我们引入了logging
模块,通过basicConfig
函数配置日志的级别和输出格式,然后定义了Logger
对象,并在main
函数中分别生成了debug
、info
、warning
、error
和critical
级别的日志信息,最终将这些日志信息输出。
二、日志的级别
在logging
模块中,我们可以使用basicConfig
函数来设置日志的级别,一共有5种级别,从高到低分别是CRITICAL
(50)、ERROR
(40)、WARNING
(30)、INFO
(20)和DEBUG
(10),默认的级别为WARNING
。
- CRITICAL:严重错误
- ERROR:一般错误
- WARNING:警告信息
- INFO:一般信息
- DEBUG:调试信息
三、日志的格式化
logging
模块中提供了套路的日志格式化,可以通过format
参数来自定义日志的格式。
以下是一些常用的日志格式化占位符:
%(name)s
:日志器名称%(levelno)s
:日志级别的数字表示%(levelname)s
:日志级别的文本表示%(pathname)s
:当前执行程序的路径%(filename)s
:当前执行程序名称%(module)s
:模块名称%(funcName)s
:函数名称%(lineno)d
:当前代码执行行号%(asctime)s
:当前时间%(message)s
:日志信息
import logging
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT)
logger = logging.getLogger(__name__)
if __name__ == '__main__':
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
上述代码中,我们定义了一个常量LOG_FORMAT
,它表示了日志的格式,最终日志信息的格式化展示就基于这个常量来。
四、日志的输出位置
在使用logging
模块记录日志时,我们还可以指定日志输出的位置,包括控制台、文件、远程服务器等等。下面介绍如何将日志信息输出到文件中。
import logging
LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
logging.basicConfig(filename='my.log', level=logging.DEBUG, format=LOG_FORMAT)
logger = logging.getLogger(__name__)
if __name__ == '__main__':
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
在定义Logger
对象的时候,我们可以通过basicConfig
函数的filename
参数来指定日志的文件名,这样就可以将所有的日志信息都输出到这个文件中。
五、日志的轮换和归档
使用logging
模块记录日志时,如果不进行文件轮换和归档,那么一个应用程序可以生成大量的日志文件,这样会占用大量的磁盘空间,也不利于日志的查阅和管理。为了解决这个问题,logging
模块提供了多种方式对日志进行轮换和归档。
下面演示一个基于时间轮换的归档,即每半天产生一个新的日志文件,并存放到指定的目录下,旧的日志文件则被归档到一个新的文件中。
import logging
from logging.handlers import TimedRotatingFileHandler
LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT)
logger = logging.getLogger(__name__)
handler = TimedRotatingFileHandler(filename='my.log', when='midnight', interval=1, backupCount=7)
handler.setFormatter(logging.Formatter(LOG_FORMAT))
logger.addHandler(handler)
if __name__ == '__main__':
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
在上述代码中,我们使用了TimedRotatingFileHandler
对象来代替basicConfig
函数中的filename
参数,通过when
、interval
和backupCount
参数来控制日志的轮换和归档。
总结
在本文中,我们介绍了Python中logging
模块的基本用法,包括日志的级别、格式化、输出位置和日志轮换等方面。对于任何一款应用程序而言,日志都是必不可少的一部分,它可以帮助开发者快速定位并解决应用程序中的错误和异常,提高代码的健壮性和稳定性。