Python 打印日志logging
简介
日志是在软件开发过程中非常重要的一部分。它可以帮助开发人员在程序运行时记录和追踪事件发生的情况,便于排错和分析。Python提供了内置的日志模块logging,使得打印日志变得非常简单和灵活。本文将详细介绍Python中的logging模块的使用方法和常见技巧。
logging模块基础
在使用logging模块之前,我们需要先导入这个模块:
import logging
然后,我们可以通过调用logging
模块的函数来创建和配置一个日志记录器。
创建日志记录器
日志记录器是logging模块中最基本的对象,用于记录和处理日志。可以使用logging.getLogger()
方法创建一个日志记录器:
logger = logging.getLogger('my_logger')
这里的'my_logger'
是创建日志记录器的名称,可以根据实际需求进行设置。
设置日志记录级别
日志记录器可以设置不同的级别,只有级别高于等于记录器的级别的日志才会被处理和记录。可以使用logger.setLevel()
方法设置日志记录器的级别,可选的级别包括:
logging.DEBUG
: 最低等级的日志记录,用于查看细节;logging.INFO
: 一般的程序运行情况信息;logging.WARNING
: 表示有潜在问题或错误发生,但程序仍然正常运行;logging.ERROR
: 表示由于严重的问题程序无法执行某些功能;logging.CRITICAL
: 最高级别的日志记录,一般表示致命的错误。
例如,我们可以将日志记录器的级别设置为INFO
:
logger.setLevel(logging.INFO)
创建日志处理器
日志处理器是用于处理和输出日志的对象。在logging模块中,有一些内置的处理器可以直接使用,包括:
StreamHandler
: 将日志输出到标准输出;FileHandler
: 将日志输出到文件;RotatingFileHandler
: 将日志输出到文件,并支持按文件大小自动切分日志;TimedRotatingFileHandler
: 将日志输出到文件,并支持按时间自动切分日志。
可以使用logging.StreamHandler()
、logging.FileHandler()
等方法创建对应的处理器。例如,我们可以创建一个将日志输出到标准输出的处理器:
stream_handler = logging.StreamHandler()
设置日志格式
日志格式决定了日志如何显示。在logging模块中,可以使用logging.Formatter()
方法来设置日志格式。例如,我们可以创建一个包含时间、级别和日志内容的格式:
format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
这里的'%(asctime)s'
表示日志的时间,'%(levelname)s'
表示日志级别,'%(message)s'
表示日志内容。
将处理器添加到记录器
创建好处理器和格式之后,我们还需要将处理器添加到日志记录器中,示例如下:
logger.addHandler(stream_handler)
stream_handler.setFormatter(format)
这里的logger.addHandler()
方法用于向日志记录器中添加处理器,stream_handler.setFormatter()
方法用于设置处理器的日志格式。
打印日志
现在,我们可以通过调用日志记录器的相关方法来打印日志了。常用的方法有:
logger.debug()
: 打印调试信息;logger.info()
: 打印一般信息;logger.warning()
: 打印警告信息;logger.error()
: 打印错误信息;logger.critical()
: 打印严重错误信息。
示例代码:
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')
完整示例
下面是一个完整示例,演示了如何使用logging模块创建日志记录器、设置日志级别、创建处理器、设置日志格式,并输出日志到控制台:
import logging
# 创建日志记录器
logger = logging.getLogger('my_logger')
logger.setLevel(logging.INFO)
# 创建处理器和日志格式
stream_handler = logging.StreamHandler()
format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
stream_handler.setFormatter(format)
# 将处理器添加到记录器
logger.addHandler(stream_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')
运行以上代码,将会在控制台输出如下内容:
2022-01-01 12:00:00,000 - INFO - This is an info message
2022-01-01 12:00:00,001 - WARNING - This is a warning message
2022-01-01 12:00:00,002 - ERROR - This is an error message
2022-01-01 12:00:00,003 - CRITICAL - This is a critical message
高级用法
除了基本的使用方法之外,logging模块还提供了一些高级用法,可以更加灵活地控制日志的输出。
输出到文件
除了将日志输出到控制台,我们还可以将日志输出到文件。可以使用logging.FileHandler()
方法创建一个文件处理器,并设置相应的日志文件名。示例代码:
file_handler = logging.FileHandler('my_log.txt')
这里的'my_log.txt'
是日志文件的文件名。
切分日志
如果日志文件非常庞大,我们可以使用logging.handlers.RotatingFileHandler
或logging.handlers.TimedRotatingFileHandler
来切分日志文件,以便于管理和查看。这两个处理器有相似的使用方法和配置方式。
RotatingFileHandler
按照文件的大小来切分日志,可以指定切分的文件大小和保存的文件个数。示例代码:
rotating_handler = logging.handlers.RotatingFileHandler('my_log.txt', maxBytes=1024, backupCount=3)
这里的maxBytes
表示单个日志文件的大小,单位为字节;backupCount
表示保留的日志文件个数。
TimedRotatingFileHandler
按照时间来切分日志,可以指定切分的时间间隔和保存的文件个数。示例代码:
timed_handler = logging.handlers.TimedRotatingFileHandler('my_log.txt', when='D', interval=1, backupCount=7)
这里的when
表示时间间隔的单位,可选的值有:
'S'
: 秒;'M'
: 分钟;'H'
:小时;'D'
: 天;'W'
: 周;'midnight'
: 每天午夜。
输出日志至多个地方
有时候我们希望将日志同时输出到控制台和文件中,可以使用logging.handlers.MultipleHandlers
来实现。示例代码:
stream_handler = logging.StreamHandler()
file_handler = logging.FileHandler('my_log.txt')
logger.addHandler(stream_handler)
logger.addHandler(file_handler)
这样,日志就会同时输出到控制台和文件中。
使用配置文件
除了在代码中直接设置日志的相关配置之外,我们还可以使用配置文件来进行配置,可以方便地调整日志的输出方式和级别。可以使用logging.config.fileConfig()
方法来加载配置文件。示例代码:
import logging.config
logging.config.fileConfig('logging.conf')
这里的'logging.conf'
是配置文件的文件名,配置文件可以使用INI格式进行编写。
自定义日志处理器和格式
如果内置的处理器和格式不能满足我们的需求,我们还可以自定义日志处理器和格式。可以继承logging.Handler
类和logging.Formatter
类,然后实现自定义的处理器和格式。示例代码:
import logging
class MyHandler(logging.Handler):
def __init__(self):
super().__init__()
def emit(self, record):
# 在这里实现自定义的日志处理逻辑
pass
class MyFormatter(logging.Formatter):
def format(self, record):
# 在这里实现自定义的日志格式
pass
logger = logging.getLogger('my_logger')
handler = MyHandler()
format = MyFormatter()
handler.setFormatter(format)
logger.addHandler(handler)
这里的MyHandler
和MyFormatter
分别是自定义的处理器和格式,可以根据实际需求进行编写。
总结
本文详细介绍了Python中打印日志的方法和技巧。通过使用logging模块,我们可以轻松地创建和配置日志记录器、设置日志级别、创建处理器、设置日志格式,并灵活地控制日志的输出。同时,我们还了解了日志输出到文件、切分日志、输出日志至多个地方、使用配置文件以及自定义日志处理器和格式的方法。通过合理地使用日志记录,可以有效地帮助我们进行程序调试、错误排查和系统分析,提高开发效率和程序可靠性。