随着技术的进步,日志成为了应用程序开发中不可或缺的一部分,它可以记录代码的运行情况,帮助开发者找出应用程序中的错误和异常,并及时对其进行修复。
一、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模块的基本用法,包括日志的级别、格式化、输出位置和日志轮换等方面。对于任何一款应用程序而言,日志都是必不可少的一部分,它可以帮助开发者快速定位并解决应用程序中的错误和异常,提高代码的健壮性和稳定性。