python-logging日志模块

本文详细解读Python logging模块的日志等级、formatter配置、常用函数及基本配置方法。包括设置DEBUG、INFO、WARNING等不同级别日志,理解日志组件如Logger、Handler、Filter和Formatter的作用,以及如何灵活运用它们进行高效日志管理。

目录

日志配置参数

日志等级

formatter格式化 

级别常用函数

logging.basicConfig(**kwargs)函数参数

简单的日志代码

四大日志组件

四大组件的方法

Logger常用的配置方法

Handler组件配置方法

Handler子类方法

Formater组件

Filter组件

简单的组件实现代码


日志配置参数

日志等级

日志等级(level)

描述

DEBUG

调试信息,通常在诊断问题的时候用

INFO

普通信息,确认程序按照预期运行

WARNING

警告信息,表示发生意想不到的事情,或者指示接下来可能会出现一些问题,但程序还是继续运行  

ERROR

错误信息,程序运行中出现了一些问题导致程序某些功能无法执行

CRITICAL

危险信息,一个严重的错误,导致程序无法继续运行

formatter格式化 

格式

描述

%(asctime)s

日志事件发生的时间

%(created)f

日志事件发生的时间戳,调用time.time()函数返回的值

%(relativeCreated)d

日志事件发生的时间相对于logging模块加载时间的相对毫秒数

%(msecs)d

日志事件发生时间的毫秒部分

%(levelname)s

该日志记录的文字形式的级别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'

%(levelno)s

该日志记录的数字形式的级别(10, 20, 30, 40, 50

%(name)s

所使用的日志器名称,默认是'root'(默认使用的是root logger

%(message)s

日志记录的文本内容

%(pathname)s

调用日志记录函数的源码文件的全路径

%(filename)s

pathname的文件名部分(含文件后缀)

%(module)s

filename的名称部分(不含后缀)

%(lineno)d

调用日志记录函数的源代码所在的行号

%(funcName)s

调用日志记录函数的函数名

%(process)d

进程ID

%(processName)s

进程名称

%(thread)d

线程ID

%(thread)s

线程名称

级别常用函数

函数

说明

logging.debug(msg, *args, **kwargs)

创建一条级别为DEBUG的日志记录

logging.info(msg, *args, **kwargs)

创建一条级别为INFO的日志记录

logging.warning(msg, *args, **kwargs)

创建一条级别为WARNING的日志记录

logging.error(msg, *args, **kwargs)

创建一条级别为ERROR的日志记录

logging.critical(msg, *args, **kwargs)

创建一条级别为CRITICAL的日志记录

logging.log(level, *args, **kwargs)

创建一条级别为level的日志记录

 **kwargs参数中的关键参数

参数名

用法说明

stack_info

值为布尔型,默认为False。值为True时,栈信息会被添加到日志中。

extra

值为dict型,可以用来自定义消息格式中所包含的格式字段,但其key值不能与logging模块定义的格式字段冲突。

exc_info

值为布尔型,值为True时,将异常信息添加到日志消息中,没有异常信息则添加None到日志中。

logging.basicConfig(**kwargs)函数参数

参数名称

描述

filename

指定日志输出目标文件的文件名,日志信息将写入到指定文件中,不会再控制台打印

filemode

指定日志文件的打开模式,默认为'a'。(该选项只在filename指定时有效)

format

指定日志输出内容的格式

datefmt

指定日志输出的时间日期格式。(该选项只在format中设置了时间字段%(asctime)s时有效)

level

指定日志器的日志级别,即指定最低级别的日志输出

stream

指定日志输出目标streamstreamfilename不能同时存在,否则出现ValueError异常)

style

指定format格式字符串风格,取值为'%''{''$',默认为'%'

handlers

该选项被指定时,它应该是一个创建了多个Handler的可迭代对象,这些handler会被添加到rootlogger。(filenamestreamhandlers只能同时单独存在,否则出现ValueError异常)

简单的日志代码

import logging

logging.debug('This is a debug log')
logging.info('This is a info log')
logging.error('This is a debug log')
logging.warning('This is a warn log')
logging.critical('This is a critical log')

  

注:默认最低输出日志级别是WARNING

调整输出级别并指定格式输出

import logging

LOG_FORMAT = '时间:%(asctime)s\t级别:%(levelname)s\t行号:%(lineno)d\t错误信息:%(message)s'
logging.basicConfig(level=logging.DEBUG,format=LOG_FORMAT)  # 指定最低输出级别为DEBUG级别

logging.debug('This is a debug log')
logging.info('This is a info log')
logging.error('This is a debug log')
logging.warning('This is a warn log')
logging.critical('This is a critical log')

    

指定日志信息输出到文件中

import logging

LOG_FORMAT = '时间:%(asctime)s\t级别:%(levelname)s\t行号:%(lineno)d\t错误信息:%(message)s'
logging.basicConfig(level=logging.DEBUG,format=LOG_FORMAT,filename='%s_log'%__name__)

logging.log(logging.DEBUG, "This is a debug log.")  # 同logging.debug("This is a debug log.")
logging.log(logging.INFO, "This is a info log.")  # 同上
logging.log(logging.WARNING, "This is a warning log.")  # 同上
logging.log(logging.ERROR, "This is a error log.")  # 同上
logging.log(logging.CRITICAL, "This is a critical log.")  # 同上

四大日志组件

组件

描述说明

Loggers(日志记录器)

提供程序直接使用的接口

Handlers(日志处理器)

将记录的日志发送到指定的位置

Filters(日志过滤器)

用于过滤特定的日志记录

Formatters(日志格式器)

用于控制日志信息的输出格式

四大组件的方法

Logger常用的配置方法

方法

说明

Logger.setLevel()

设置日志器处理的日志消息的最低级别

Logger.addHandler()

为logger对象添加一个handler对象

Logger.removeHandler()

为logger对象移除一个handler对象

Logger.addFilter()

为logger对象添加一个filter过滤器对象

Logger.removeFilter()

为logger对象移除一个filter对象

对logger对象创建日志记录方法

方法

描述

Logger.debug(), Logger.info(), Logger.warning(), Logger.error(), Logger.critical()

创建一个与其方法名对应等级的日志记录

Logger.exception()

通常只是在exception handler中调用此方法,用来创建一个类似于Logger.error()的日志消息,Logger.exception()会输出堆栈追踪信息。

Logger.log()

指定一个明确的日志等级(level)参数来创建一个日志记录

Handler组件配置方法

方法

描述

Handler.setLevel()

设置handler将处理的日志消息的最低严重级别

Handler.setFormatter()

为handler创建一个格式器对象

Handler.addFilter()

为handler添加一个过滤器对象

Handler.removeFilter()

handler删除一个过滤器对象

Handler子类方法

Handler子类方法

描述

logging.StreamHandler()

将日志信息保存或输出到Stream,输出到控制台

logging.FileHandler()

将日志信息保存到磁盘文件,默认情况下文件大小会无限增长,输出到文件

logging.handlers.RotatingFileHandler()

将日志信息保存到磁盘文件,并支持日志文件按大小切割

logging.hanlders.TimedRotatingFileHandler()

将日志信息保存到磁盘文件,并支持日志文件按时间切割

logging.handlers.HTTPHandler()

将日志信息以GET或POST的方式发送给HTTP服务器

logging.handlers.SMTPHandler()

将日志信息发送给指定的email地址

Formater组件

def __init__(self, fmt=None, datefmt=None, style='%', validate=True):

实例化参数:

参数名

用法说明

fmt

指定消息格式化字符串,不指定时默认使用message的原始值

datefmt

指定日期格式字符串,不指定时默认使用"%Y-%m-%d %H:%M:%S"格式

style

格式化符号,取值有'%', '{'、'$',不指定时默认使用'%'

Filter组件

class Filter(object):
    """
    Filter instances are used to perform arbitrary filtering of LogRecords.

    Loggers and Handlers can optionally use Filter instances to filter
    records as desired. The base filter class only allows events which are
    below a certain point in the logger hierarchy. For example, a filter
    initialized with "A.B" will allow events logged by loggers "A.B",
    "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
    initialized with the empty string, all events are passed.

    一个filter实例化时传递的name参数值为'A.B',则该filter实例将只允许名称为如下规则的loggers产 
    生的日志记录通过过滤:'A.B','A.B,C','A.B.C.D','A.B.D',而名称为'A.BB', 'B.A.B'的 
    loggers产生的日志则会被过滤掉。如果name的值为空字符串,则允许所有的日志事件通过过滤。
    """
    def __init__(self, name=''):

        self.name = name
        self.nlen = len(name)

    def filter(self, record):
        """
        Determine if the specified record is to be logged.
        Is the specified record to be logged? Returns 0 for no, nonzero for
        yes. If deemed appropriate, the record may be modified in-place.

        filter方法用于具体控制传递的record记录是否能通过过滤,如果该方法返回值为0表示不能通 
        过过滤,返回值为非0表示可以通过过滤。
        """
        if self.nlen == 0:
            return True
        elif self.name == record.name:
            return True
        elif record.name.find(self.name, 0, self.nlen) != 0:
            return False
        return (record.name[self.nlen] == ".")

简单的组件实现代码

import logging

# 创建日志处理器对象
logger = logging.getLogger('%s.log'%__name__)
logger.setLevel(level=logging.DEBUG)  # 创建日志器输出的最低级别,决定控制台和文件日志输出最低级别

# 创建日志输出
fh_strea = logging.StreamHandler()   # 控制台输出
fh = logging.FileHandler('test.log')  # 写入到文件
fh.setLevel(level=logging.DEBUG)  # 创建handler最低输出级别,决定文件日志输出最低级别

# 创建handler日志格式
LOG_FORMAT = logging.Formatter('时间:%(asctime)s\t级别:%(levelname)s\t行号:%(lineno)d\t日志信息:%(message)s')
fh.setFormatter(LOG_FORMAT)
fh_strea.setFormatter(LOG_FORMAT)

# 添加日志配置到创建的日志对象中
logger.addHandler(fh)  # 添加文件输出
logger.addHandler(fh_strea)  # 添加控制台输出


def sum():
    try:
        for i in range(5):
            a = 12/(i-2)
            logger.debug(a)
    except Exception as e:
        logger.error(e)

sum()

  

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值