文章

Logging模块梳理与备忘

更清楚的梳理了不同组件的配置关系

## 核心组件

组件名称

对应类名

对应描述

日志器

Logger

提供了应用程序可以一直使用的接口

处理器

Handler

将创建的日志记录发送到合适的目的输出

过滤器

Filter

提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录,也可以直接使用普通的函数代替

格式器

Formatter

决定日志记录的最终输出格式

通过全局配置并使用

全局配置:使用logging.basicConfig进行全局配置,这样所有的 logger默认都使用这个配置

logging.basicConfig(filename='log.txt',
                     format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s-%(funcName)s',
                     level=logging.ERROR)
logging.warning('waring:警告信息')
logging.error('error:错误信息')

逐项配置并使用

image-20250925115933347

logger可以设置 handler、filter

handler可以设置filter、format

日志的处理链条:日志消息 → Logger → Handler → 输出

import logging
​
# 创建logger
logger = logging.getLogger('example')
logger.setLevel(logging.DEBUG)
​
# 创建 formatter
formatter = logging.Formatter('HANDLER格式: %(asctime)s - %(name)s - %(levelname)s - %(message)s')
​
# 创建handler并设置format
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
handler.setFormatter(formatter) 
​
# 将handler添加到logger
logger.addHandler(handler)
​
​
# 测试输出
logger.info('这是一条测试消息')

其他相关配置信息

日志等级

等级(低到高)

对应描述

DEBUG

调试,记录最详细日志信息,在问题诊断时有用

INFO

Information简称,记录一些设置的关键节点信息

WARNING

警告,记录不期望的事情发生时的信息(如,磁盘可用空间较低),程序仍正常

ERROR

错误,记录由于更严重的问题而导致软件无法执行某些功能时的信息

CRITICAL

严重,记录发生严重错误,程序本身可能无法继续运行时的信息

Format支持的变量

对应格式

格式描述

%(levelname)s

日志级别名称

%(filename)s

当前程序的路径

%(funcName)s

日志所属的当前函数

%(lineno)d

日志的当前行号

%(asctime)s

日志的时间

%(thread)d

线程的ID

%(threadName)s

线程的名称

%(process)d

进程的ID

%(message)s

日志的信息

Filter 的使用示例

可以使用过滤器对象,也可以使用普通的函数来处理,根据返回值的 bool类型判断是否打印该消息

def filter(record):
    print(record)
    return True
  
mylogger = logging.getLogger('my-logger')
mylogger.addFilter(filter)
mylogger.error('error,一般用来打印一些错误信息')

Handler类型

Handler名称

作用描述

StreamHandler

将日志消息输出到流(如标准输出sys.stdout或标准错误sys.stderr)。

FileHandler

将日志消息输出到文件。

RotatingFileHandler

将日志消息输出到文件,并在文件达到一定大小时自动轮转。

TimedRotatingFileHandler

将日志消息输出到文件,并在指定时间间隔内自动轮转。

SocketHandler

将日志消息通过网络发送到指定的套接字。

DatagramHandler

将日志消息通过UDP发送到指定的地址。

SMTPHandler

将日志消息通过电子邮件发送。

SysLogHandler

将日志消息发送到SysLog服务器。

HTTPHandler

将日志消息通过HTTP协议发送到指定的URL。

NullHandler

一个空的处理器,用于在没有配置日志处理器时避免错误。

StreamHandler 示例:将日志消息输出到控制台

import logging
​
logger = logging.getLogger('StreamHandlerExample')
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
logger.addHandler(handler)
logger.info('StreamHandler: 这是一个 info 消息')

FileHandler 示例:将日志消息输出到文件

import logging
​
logger = logging.getLogger('FileHandlerExample')
logger.setLevel(logging.INFO)
handler = logging.FileHandler('example.log')
logger.addHandler(handler)
logger.info('FileHandler: 这是一个 info 消息')

RotatingFileHandler 示例:将日志消息输出到文件,并在文件达到一定大小时自动轮转

import logging
from logging.handlers import RotatingFileHandler
​
logger = logging.getLogger('RotatingFileHandlerExample')
logger.setLevel(logging.INFO)
handler = RotatingFileHandler('example.log', maxBytes=1024, backupCount=3)
logger.addHandler(handler)
logger.info('RotatingFileHandler: 这是一个 info 消息')

TimedRotatingFileHandler 示例:将日志消息输出到文件,并在指定时间间隔内自动轮转

import logging
from logging.handlers import TimedRotatingFileHandler
​
logger = logging.getLogger('TimedRotatingFileHandlerExample')
logger.setLevel(logging.INFO)
handler = TimedRotatingFileHandler('example.log', when='M', interval=1, backupCount=3)
logger.addHandler(handler)
logger.info('TimedRotatingFileHandler: 这是一个 info 消息')

SocketHandler 示例:将日志消息通过网络发送到指定的套接字

import logging
from logging.handlers import SocketHandler
​
logger = logging.getLogger('SocketHandlerExample')
logger.setLevel(logging.INFO)
handler = SocketHandler('localhost', 5000)
logger.addHandler(handler)
logger.info('SocketHandler: 这是一个 info 消息')

DatagramHandler 示例:将日志消息通过UDP发送到指定的地址

import logging
from logging.handlers import DatagramHandler

logger = logging.getLogger('DatagramHandlerExample')
logger.setLevel(logging.INFO)
handler = DatagramHandler('localhost', 5000)
logger.addHandler(handler)
logger.info('DatagramHandler: 这是一个 info 消息')

SMTPHandler 示例:将日志消息通过电子邮件发送

import logging
from logging.handlers import SMTPHandler

logger = logging.getLogger('SMTPHandlerExample')
logger.setLevel(logging.INFO)
handler = SMTPHandler(
    mailhost=('smtp.example.com', 587),
    fromaddr='from@example.com',
    toaddrs=['to@example.com'],
    subject='Log Message',
    credentials=('user', 'password'),
    secure=None
)
logger.addHandler(handler)
logger.info('SMTPHandler: 这是一个 info 消息')

SysLogHandler 示例:将日志消息发送到SysLog服务器

import logging
from logging.handlers import SysLogHandler

logger = logging.getLogger('SysLogHandlerExample')
logger.setLevel(logging.INFO)
handler = SysLogHandler(address='/dev/log')
logger.addHandler(handler)
logger.info('SysLogHandler: 这是一个 info 消息')

HTTPHandler 示例:将日志消息通过HTTP协议发送到指定的URL

import logging
from logging.handlers import HTTPHandler

logger = logging.getLogger('HTTPHandlerExample')
logger.setLevel(logging.INFO)
handler = HTTPHandler(
    host='localhost:8080',
    url='/log',
    method='POST'
)
logger.addHandler(handler)
logger.info('HTTPHandler: 这是一个 info 消息')

NullHandler 示例:一个空的处理器,用于在没有配置日志处理器时避免错误

import logging

logger = logging.getLogger('NullHandlerExample')
logger.setLevel(logging.INFO)
handler = logging.NullHandler()
logger.addHandler(handler)
logger.info('NullHandler: 这是一个 info 消息')

许可协议:  CC BY 4.0