python 记录 log 的标准库 logging

 介绍

        Python 的 logging 库是标准库中的一部分,用于在应用程序中实现灵活的日志记录功能。它提供了比简单的 print 语句更强大和更可控的日志记录机制,支持多级日志、日志格式化、日志输出到不同的目的地(如文件、网络、控制台等)以及日志过滤和处理。

logging 模块的核心概念包括:

  • Loggers:日志记录器,负责生成日志记录。
  • Handlers:处理器,负责将日志记录发送到特定的目的地。
  • Formatters:格式化器,用于控制日志消息的布局和格式。
  • Filters:过滤器,用于决定哪些日志记录应该被处理。

        Logger是一个树形层级结构,在使用接口debug,info,warn,error,critical之前必须创建Logger实例,即创建一个记录器,如果没有显式的进行创建,则默认创建一个root logger,并应用默认的日志级别(WARN),处理器Handler(StreamHandler,即将日志信息打印输出在标准输出上),和格式化器Formatter(默认的格式即为第一个简单使用程序中输出的格式)。

        Logger可以包含一个或多个Handler和Filter,即Logger与Handler或Fitler是一对多的关系;
一个Logger实例可以新增多个Handler,一个Handler可以新增多个格式化器或多个过滤器,而且日志级别将会继承。

        当一条日志产生的时候,所有的Handler 都会根据自己的配置对这条日志进行记录

示例

import logging

# 创建一个logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)  # 设置logger的日志级别

# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('app.log')
fh.setLevel(logging.DEBUG)  # 设置handler的日志级别

# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)  # 设置handler的日志级别

# 定义handler的输出格式s前面可以加数字定义宽度,负数靠左对齐,正数靠右对齐
formatter = logging.Formatter('%(asctime)s | %(name)s | %(levelname)-8s | %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)

# 给logger添加handler
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')

basicConfig()可以进行全局的配置,后续产生的 logger,会继承这个配置

        logging.getLogger("name")可以重复调用,如果 name 相同,就会返回相同的实例,很多时候可能会写成logging.getLogger(__name__),如果是运行程序本身就是 __main__,如果是其他程序 import 运行其值为文件名,就是·format 中 %(name)s 显示的内容

log = logging.getLogger('logger2')
log.setLevel(logging.DEBUG)  # 设置logger的日志级别

# 创建一个handler,用于写入日志文件
fh2 = logging.FileHandler('app2.log')
fh2.setLevel(logging.DEBUG)  # 设置handler的日志级别
formatter = logging.Formatter('%(asctime)s | %(name)s | %(levelname)-8s | %(message)s')
fh2.setFormatter(formatter)
log.addHandler(fh2)

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

记录异常

try:
    1/0
except:
    log.exception("get except:")

会把异常信息写入log文件

根据时间间隔来滚动日志文件

import logging
from logging.handlers import TimedRotatingFileHandler

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

handler = TimedRotatingFileHandler("app.log", when="midnight", interval=1, backupCount=7)
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

logger.addHandler(handler)

logger.info("This is a log message.")

  • when="H":小时。interval 指定多少小时后滚动一次日志文件。
  • when="D"when="MIDNIGHT":天。interval 指定多少天后滚动一次日志文件。
  • when="W0" 到 "W6":周几。interval 指定多少周后滚动一次日志文件。例如,when="W0" 表示周一,interval=1 表示每周一滚动日志文件。

        在这个例子中,日志文件 app.log 将在每天午夜(when="midnight")时自动滚动,最多保留最近七天的日志文件(backupCount=7

根据文件大小来滚动日志文件

import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

handler = RotatingFileHandler("myapp.log", maxBytes=20*1024*1024, backupCount=5)
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

logger.addHandler(handler)

logger.info("This is a log message.")

        在这个例子中,日志文件 myapp.log 当达到20MB(maxBytes=20*1024*1024)时将自动滚动,最多保留五个旧日志文件(backupCount=5

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值