python logging 详解


Python的logging模块提供了灵活的日志记录功能,可以记录各种级别的日志消息,并可以将日志消息输出到文件、控制台、网络等不同的位置。

下面是Python logging模块的详细使用方法:

1. 导入logging模块

import logging

2. 配置日志记录器

可以通过BasicConfig()方法来配置日志记录器的基本属性,例如日志级别、输出格式、输出位置等。

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)s %(message)s',
                    filename='myapp.log',
                    filemode='w')

其中:

  • level:设置日志级别,可以设置为DEBUG、INFO、WARNING、ERROR、CRITICAL。
  • format:设置日志输出格式,可以自己定义输出格式,例如’%(asctime)s %(levelname)s %(message)s’,表示输出时间、日志级别和消息内容。
  • filename:设置日志输出文件名,如果不设置则默认输出到控制台。
  • filemode:设置日志输出文件的打开模式,可以设置为’w’表示覆盖写,'a’表示追加写。

3. 记录日志消息

可以使用logging模块提供的不同方法来记录不同级别的日志消息,例如:

logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')

4. 自定义日志记录器

可以通过Logger类来自定义日志记录器,例如:

logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler('myapp.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
handler.setFormatter(formatter)
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')

其中:

  • getLogger():获取日志记录器,可以设置记录器名称。
  • setLevel():设置日志级别。
  • FileHandler():设置日志输出位置,可以设置输出文件名。
  • Formatter():设置日志输出格式。
  • addHandler():添加处理器。

5. 日志轮换

可以使用logging模块提供的RotatingFileHandler或TimedRotatingFileHandler类来实现日志轮换,例如:

handler = logging.handlers.RotatingFileHandler('myapp.logmaxBytes=1024*1024, backupCount=5)
handler.setFormatter(formatter)
logger.addHandler(handler)

其中:

  • RotatingFileHandler():创建日志轮换处理器,可以设置最大文件大小和备份数量。
  • maxBytes:设置日志文件最大大小,超过这个大小就会自动创建新的日志文件。
  • backupCount:设置备份数量,超过这个数量就会删除最早的日志文件。

TimedRotatingFileHandler类可以按照时间轮换日志文件,例如:

handler = logging.handlers.TimedRotatingFileHandler('myapp.log', when='midnight', backupCount=5)
handler.setFormatter(formatter)
logger.addHandler(handler)

其中:

  • TimedRotatingFileHandler():创建按时间轮换的日志处理器。
  • when:设置轮换时间,可以设置为’midnight’、‘H’、'M’等不同的时间间隔。

6. 日志过滤器

可以通过Filter类来设置日志过滤器,只有符合条件的日志消息才会被记录,例如:

class MyFilter(logging.Filter):
    def filter(self, record):
        return 'important' in record.getMessage()

handler = logging.FileHandler('myapp.log')
handler.addFilter(MyFilter())
handler.setFormatter(formatter)
logger.addHandler(handler)

logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is an important warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

其中:

  • Filter():创建日志过滤器。
  • filter():实现过滤器的逻辑,返回True表示记录该日志消息,返回False表示忽略该日志消息。

7. 日志异常跟踪

可以通过exc_info参数来记录异常信息,例如:

try:
    raise ValueError('This is an exception message')
except ValueError:
    logger.error('Exception occurred', exc_info=True)

其中:

  • exc_info=True:记录异常信息,包括异常类型、异常消息和异常堆栈。

以上就是Python logging模块的详细使用方法,通过灵活配置和使用,可以实现各种不同场景下的日志记录和管理。

8. 日志输出到控制台和文件

在默认情况下,日志信息只会输出到文件中,如果需要同时输出到控制台,可以添加StreamHandler处理器,例如:

import sys

handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(formatter)
logger.addHandler(handler)

其中:

  • StreamHandler():创建输出到控制台的处理器,可以设置输出流。
  • sys.stdout:设置输出流为标准输出。

9. 使用配置文件

可以通过配置文件来设置日志记录器的属性,例如:

[loggers]
keys=root,sampleLogger

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler

[logger_sampleLogger]
level=DEBUG
handlers=fileHandler
qualname=sampleLogger
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFormatter
args=('myapp.log', 'w')

[formatter_simpleFormatter]
format=%(asctime)s %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S

其中:

  • loggers:设置日志记录器的名称。
  • handlers:设置日志处理器的名称。
  • formatters:设置日志格式化器的名称。
  • logger_*:设置日志记录器的属性,例如日志级别、处理器、传递性等。
  • handler_*:设置日志处理器的属性,例如处理器类型、日志级别、格式化器等。
  • formatter_*:设置日志格式化器的属性,例如输出格式、时间格式等。

可以通过fileConfig()方法来加载配置文件,例如:

import logging.config

logging.config.fileConfig('logging.conf')

logger = logging.getLogger('sampleLogger')

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')

10. 使用第三方库

除了Python自带的logging模块之外,还有一些第三方库可以实现更多的功能和扩展,例如:

  • loguru:提供了更加灵活和方便的日志记录方式。
  • structlog:提供了更加可定制化和扩展性的日志记录方式。
  • coloredlogs:提供了彩色输出和更加易读的日志信息。
  • logbook:提供了更加高效和线程安全的日志记录方式。

这些第三方库都有其自己的特点和优势,可以根据具体需求选择适合的库来实现日志记录和管理。

11. format格式详解

logging模块中的format参数用于设置日志的格式化输出方式,可以自定义输出的内容和格式。下面是format参数的详解:

  • %(asctime)s:日志记录时间,格式为“年-月-日 时:分:秒,毫秒”。
  • %(name)s:日志记录器的名称。
  • %(levelname)s:日志级别名称。
  • %(message)s:日志消息内容。
  • %(pathname)s:当前执行代码的路径。
  • %(filename)s:当前执行代码的文件名。
  • %(funcName)s:当前执行函数的名称。
  • %(lineno)d:当前执行代码的行号。
  • %(thread)d:当前执行线程的ID。
  • %(threadName)s:当前执行线程的名称。
  • %(process)d:当前执行进程的ID。
  • %(processName)s:当前执行进程的名称。

例如,设置日志格式为’%(asctime)s %(levelname)s %(message)s’,表示输出时间、日志级别和消息内容。

还可以通过添加格式控制符来进一步定制输出格式,例如:

  • %(levelname)-8s:设置日志级别名称的宽度为8个字符,左对齐。
  • %(message).50s:设置日志消息内容的最大宽度为50个字符,超过部分截断。
  • %(asctime)s,%(msecs)03d:设置日志记录时间的毫秒部分为3位数字,例如“2021-09-23 10:23:45,123”。
  • %(filename)s:%(lineno)d:设置当前执行代码的文件名和行号,例如“test.py:20”。

通过灵活使用格式控制符,可以实现各种不同的输出格式和显示效果,方便日志记录和查看。

12. 总结

Python的logging模块提供了灵活的日志记录功能,可以记录各种级别的日志消息,并可以将日志消息输出到文件、控制台、网络等不同的位置。通过灵活配置和使用,可以实现各种不同场景下的日志记录和管理。在实际应用中,需要根据具体需求选择合适的日志记录方式和工具,以方便运维和调试。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值