Python之logging模块

一、简介

logging 是 Python 标准库中用于记录日志信息的模块。它提供了一种灵活的方式来控制输出日志的级别和目标。logging 模块支持将日志消息发送到不同的目标,例如控制台、文件、网络等。

二、作用

  • 记录程序运行时的信息,以便在后期调试和分析时使用。
  • 提供不同级别的日志,如DEBUG、INFO、WARNING、ERROR、CRITICAL,以便根据需要进行筛选和过滤。

三、logging模块实例

import logging

# 创建一个 logger 对象
logger = logging.getLogger('example')
logger.setLevel(logging.DEBUG)  # 设置日志级别为 DEBUG

# 创建文件处理器,将日志写入文件 (这里就是创建一个名为example的日志文件)
fh = logging.FileHandler('example.log')
fh.setLevel(logging.DEBUG)  # 文件处理器的日志级别也设置为 DEBUG

# 创建控制台处理器,将日志输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)  # 控制台处理器的日志级别设置为 ERROR

# 创建日志格式器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# 为处理器设置格式器
fh.setFormatter(formatter)
ch.setFormatter(formatter)

# 将处理器添加到 logger 对象
logger.addHandler(fh)
logger.addHandler(ch)

# 记录不同级别的日志
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' 的 logger 对象,并设置了其日志级别为 DEBUG。然后,我们创建了一个文件处理器 (fh) 和一个控制台处理器 (ch),并为它们设置了日志级别和格式器。最后,我们将这两个处理器添加到 logger 对象中。通过 logger 对象,我们可以记录不同级别的日志信息。

对于日志级别的一半含义

  • DEBUG:详细的调试信息,通常用于诊断问题。
  • INFO:提供程序正常运行时的一般信息,用于确认程序是否按预期执行。
  • WARNING:表示可能的问题,不会影响程序的正常运行,但需要注意。
  • ERROR:指示发生了错误,可能导致程序无法执行某些功能。
  • CRITICAL:表示严重错误,可能导致程序中断或崩溃。

在上述的 logging 模块的实例中,我们设置了文件处理器 (fh) 的日志级别为 DEBUG,这意味着它将记录所有级别的日志消息。而控制台处理器 (ch) 的日志级别设置为 ERROR,这意味着它将只记录 ERROR 级别及以上的日志消息。

通过设置不同处理器的日志级别,可以在不同的目标(例如文件和控制台)上记录不同详细程度的日志信息。这使得在生产环境中,可以只记录关键的错误,而在开发和调试阶段,可以记录更详细的信息,以帮助排查问题。

四、常见的日志格式字符串

1.%(asctime)s 日志记录的时间,以可读的字符串表示。

%(asctime)s: 日志记录的时间,以可读的字符串表示。

2. %(levelname)s 日志级别(例如,DEBUG、INFO、WARNING、ERROR、CRITICAL)。

logging.Formatter('%(levelname)s: %(message)s')

3. %(message)s 日志消息的文本内容。这个占位符表示日志消息的文本内容,如果你希望在日志中包含消息的文本内容,你可以使用它。然而,你可以根据需要自定义日志记录的输出格式,包括是否包含消息文本。

logging.Formatter('%(asctime)s - %(message)s')

4. %(filename)s 产生日志记录的源文件名。

logging.Formatter('%(filename)s - %(message)s')

5. %(lineno)d 产生日志记录的源文件行号。

logging.Formatter('%(lineno)d - %(message)s')

6. %(funcName)s 产生日志记录的函数名。

logging.Formatter('%(funcName)s - %(message)s')

7. %(process)d 进程 ID。

logging.Formatter('%(process)d - %(message)s')

8. %(thread)d 线程 ID。

logging.Formatter('%(thread)d - %(message)s')

9.%(name)s 日志记录器的名称。 

logging.Formatter('%(name)s - %(message)s')

10. %(levelname)s 日志级别(例如,DEBUG、INFO、WARNING、ERROR、CRITICAL)。

logging.Formatter('%(levelname)s: %(message)s')

 

这里在补充一个例子:

logger = logging.getLogger('model training') 
 # 创建一个名为 'model training' 的 logger 对象

logger.setLevel(logging.DEBUG) 
# 设置 logger 的日志级别为 DEBUG,表示记录所有级别的日志信息。日志级别包括 DEBUG、INFO、WARNING、ERROR、CRITICAL。

fh = logging.FileHandler(os.path.join(opts.path_run_dir, 'run.log'), mode='a')
# 创建一个文件处理器(FileHandler),用于将日志信息写入文件。这里指定日志文件的路径为 os.path.join(opts.path_run_dir, 'run.log'),以追加模式('a')打开文件。

sh = logging.StreamHandler(sys.stdout)
# 创建一个流处理器(StreamHandler),用于将日志信息输出到标准输出流(stdout),即控制台fh.setFormatter(logging.Formatter('%(asctime)s - %(message)s')) 为文件处理器设置日志格式。在这里,使用 logging.Formatter 来定义日志格式,包括时间戳(asctime)和消息(message)。
    


logger.addHandler(fh)  # 将文件处理器添加到 logger 对象,以便将日志写入文件   
logger.addHandler(sh)  # 将流处理器添加到 logger 对象,以便将日志输出到控制台

五、对于RotatingFileHandler

RotatingFileHandlerlogging 模块提供的一种文件处理器,它可以在日志文件达到一定大小时自动切割文件,保留旧的日志文件并创建新的日志文件。这有助于限制日志文件的大小,防止它变得过大。

实例如下:

import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger('example')
logger.setLevel(logging.DEBUG)

# 创建一个 RotatingFileHandler,将日志记录到名为 'example.log' 的文件中
# 设置每个日志文件的最大大小为 1 MB,保留备份文件的数量为 3
fh = RotatingFileHandler('example.log', maxBytes=1e6, backupCount=3)
fh.setLevel(logging.DEBUG)

# 创建一个格式化器,指定日志的格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

# 将格式化器添加到文件处理器
fh.setFormatter(formatter)

# 将文件处理器添加到 logger 对象
logger.addHandler(fh)

# 现在,可以使用 logger 记录日志了
for i in range(10):
    logger.debug('This is log message %d' % i)
  • maxBytes 表示一个日志文件的最大大小,当达到这个大小时,当前日志文件会被备份并重新创建一个新的日志文件。如果设置为 0,表示没有大小限制。

  • backupCount 表示要保留的备份文件的数量。当日志文件达到 maxBytes 时,会触发备份。backupCount 控制保留多少个备份文件。如果设置为 0,表示不保留备份文件。

六、对于TimedRotatingFileHandler

TimedRotatingFileHandler 是 Python logging 模块中的一种处理程序,可以按照时间滚动创建新的日志文件。它继承自 logging.handlers.TimedRotatingFileHandler

import logging
from logging.handlers import TimedRotatingFileHandler

logger = logging.getLogger('example')
logger.setLevel(logging.DEBUG)

# 创建一个 TimedRotatingFileHandler 实例
handler = TimedRotatingFileHandler('example.log', when='midnight', interval=1, backupCount=5)
handler.setLevel(logging.DEBUG)

# 创建一个格式化器,将其添加到处理程序
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

# 将处理程序添加到 logger
logger.addHandler(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')
  • when: 滚动的时间单位,可以是 "S"(秒),"M"(分钟),"H"(小时),"D"(天),"W0""W6"(每周的一天,0 是星期一),或者 "midnight"(每天的午夜)。

  • interval: 滚动的时间间隔,表示每隔多长时间创建一个新的日志文件。

  • backupCount: 保留的备份文件数量,超过这个数量的备份文件将被删除。

推荐视频:

python实用模块之logging_哔哩哔哩_bilibili

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值