Python模块之logging和colorlog

使用logging和colorlog实现日志记录可以方便地记录程序的运行情况,方便调试和分析问题。下面将详细说明如何使用logging和colorlog,并提供相应的代码示例。

1. 安装colorlog模块

首先需要安装colorlog模块。可以通过pip命令进行安装:

pip install colorlog

2. logging模块介绍

logging模块是Python自带的日志记录模块。logging模块提供了非常灵活的日志记录方式,可以根据不同场景需求灵活配置,同时还支持多线程处理、远程日志收集等高级功能。

logging模块中有五个主要的类:

  • Loggers:提供应用程序可直接使用的接口。
  • Handlers:用于将日志记录发送到适当的目的地。例如文件、终端和网络等。
  • Filters:提供细粒度的日志过滤功能,可以基于任何的日志属性(例如日志级别、时间等)进行过滤。
  • Formatters:用于控制日志信息的输出格式。
  • Levels:提供日志的严重程度级别。

下面分别说明这些类及其方法和属性。

Loggers类

Loggers类是提供应用程序可直接使用的接口。通常我们在应用程序中通过logging.getLogger()方法获取一个logger对象,然后使用这个logger对象进行日志记录。

Loggers类的主要方法:

  • getLogger(name=None):获取一个logger对象,name为logger的名称,如果不传递name则使用root logger。
  • setLevel(level):设置logger对象的日志级别,只有高于等于这个级别的日志才会被输出。例如设置为logging.DEBUG,则logging.debug、logging.info、logging.warning、logging.error、logging.critical这五个级别的日志都会被输出。
  • addHandler(hdlr):向logger对象中添加一个handler,用于将日志输出到指定位置。
  • removeHandler(hdlr):从logger对象中删除指定的handler。
  • addFilter(filter):向logger对象中添加一个filter,用于对日志进行过滤。
  • removeFilter(filter):从logger对象中删除指定的filter。
  • debug(msg, *args, **kwargs):记录一条debug级别的日志。
  • info(msg, *args, **kwargs):记录一条info级别的日志。
  • warning(msg, *args, **kwargs):记录一条warning级别的日志。
  • error(msg, *args, **kwargs):记录一条error级别的日志。
  • critical(msg, *args, **kwargs):记录一条critical级别的日志。
  • log(level, msg, *args, **kwargs):记录指定级别的日志。
  • isEnabledFor(level):判断是否启用了指定级别的日志记录。

Loggers类的主要属性:

  • level:logger对象的日志级别。
  • handlers:logger对象中添加的handler列表。
  • filters:logger对象中添加的filter列表。

Handlers类

Handlers类用于将日志记录发送到适当的目的地。例如文件、终端和网络等。常用的handler有:

  • StreamHandler:将日志记录输出到终端。
  • FileHandler:将日志记录输出到文件。
  • RotatingFileHandler:将日志记录输出到滚动文件中。
  • SMTPHandler:将日志记录通过邮件发送出去。

Handlers类的主要方法:

  • setFormatter(fmt):设置handler对象的输出格式。
  • setLevel(level):设置handler对象的日志级别。
  • emit(record):将日志记录发送到handler指定的地方。
  • flush():清空handler内部缓存的日志记录。

Handlers类的主要属性:

  • formatter:handler对象的输出格式。
  • level:handler对象的日志级别。

Filters类

Filters类提供了细粒度的日志过滤功能,可以基于任何的日志属性(例如日志级别、时间等)进行过滤。

Filters类的主要方法:

  • filter(record):判断是否要处理指定的日志记录。

Formatters类

Formatters类用于控制日志信息的输出格式。常用的格式化符号有:

  • %(name)s:logger的名称。
  • %(levelno)s:日志级别的数字表示,如10、20、30、40、50。
  • %(levelname)s:日志级别的字符串表示,如DEBUG、INFO、WARNING、ERROR、CRITICAL。
  • %(pathname)s:调用日志记录函数所在的文件的完整路径名,例如/usr/local/www/python/debug.py。
  • %(filename)s:调用日志记录函数所在的文件名,例如debug.py。
  • %(funcName)s:调用日志记录函数的函数名,例如main。
  • %(lineno)d:调用日志记录函数所在的行号,例如33。
  • %(asctime)s:日志记录时间的字符串表示,例如“2019-01-01 12:00:00,000”。
  • %(thread)d:线程ID。
  • %(message)s:日志记录的信息。

Formatters类的主要方法:

  • format(record):将日志记录转换为要输出的格式化字符串。

3. colorlog模块介绍

colorlog是一个支持颜色输出的Python日志模块。colorlog是基于logging模块的,可以方便地与logging模块一起使用。colorlog可以按照不同的日志级别为不同的级别设置不同的颜色,方便快速定位问题。

colorlog主要有如下特点:

  • 支持多线程。
  • 支持Python 2.x和Python 3.x。
  • 日志信息输出到标准输出或文件。

4. 示例代码

下面是使用logging和colorlog模块记录日志的示例代码,包括写文件和不写文件两种格式。

import logging
import colorlog

def init_logger(logfile, loglevel):
    """初始化日志记录器

    Args:
        logfile: 日志文件名,不写入日志文件则传入None
        loglevel: 日志级别,可选值为debug、info、warning、error、critical

    Returns:
        logger: 返回初始化后的logger对象
    """
    # 创建logger对象
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)

    # 创建控制台输出handler
    console_handler = colorlog.StreamHandler()
    console_handler.setFormatter(colorlog.ColoredFormatter(
        '%(log_color)s[%(asctime)s %(levelname)s] %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S',
        log_colors={
            'DEBUG': 'cyan',
            'INFO': 'green',
            'WARNING': 'yellow',
            'ERROR': 'red',
            'CRITICAL': 'red,bg_white'
        }
    ))
    logger.addHandler(console_handler)

    if logfile:
        # 创建文件输出handler
        file_handler = logging.FileHandler(logfile, encoding='utf-8')
        file_handler.setLevel(logging.DEBUG)
        file_handler.setFormatter(logging.Formatter(
            '%(asctime)s [%(levelname)s] %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S'
        ))
        logger.addHandler(file_handler)

    # 设置日志级别
    if loglevel == 'debug':
        logger.setLevel(logging.DEBUG)
    elif loglevel == 'info':
        logger.setLevel(logging.INFO)
    elif loglevel == 'warning':
        logger.setLevel(logging.WARNING)
    elif loglevel == 'error':
        logger.setLevel(logging.ERROR)
    elif loglevel == 'critical':
        logger.setLevel(logging.CRITICAL)

    return logger

if __name__ == '__main__':
    # 初始化日志记录器,不写文件
    logger = init_logger(None, 'debug')
    logger.debug('debug message')
    logger.info('info message')
    logger.warning('warning message')
    logger.error('error message')
    logger.critical('critical message')

    # 初始化日志记录器,写文件
    logger = init_logger('test.log', 'info')
    logger.debug('debug message')
    logger.info('info message')
    logger.warning('warning message')
    logger.error('error message')
    logger.critical('critical message')

上述代码中,init_logger()函数用于初始化日志记录器,并返回初始化好的logger对象。该函数接收两个参数:logfile和loglevel。如果logfile为None,则不写入日志文件;如果logfile为一个文件名,则将日志信息写入该文件中。loglevel为日志级别,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

༒࿈十三༙྇࿈༒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值