您的位置:

使用Python打印日志

随着技术的进步,日志成为了应用程序开发中不可或缺的一部分,它可以记录代码的运行情况,帮助开发者找出应用程序中的错误和异常,并及时对其进行修复。

一、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模块的基本用法,包括日志的级别、格式化、输出位置和日志轮换等方面。对于任何一款应用程序而言,日志都是必不可少的一部分,它可以帮助开发者快速定位并解决应用程序中的错误和异常,提高代码的健壮性和稳定性。