Python 限制日志大小的两种方案:RotatingFileHandler 与挂载文件

沈知远
沈知远
发布时间:2026-10-14| 4人浏览过
原创

本文介绍Python中限制日志大小的两种方法。重点解析RotatingFileHandler类的filename、mode、maxBytes、backupCount及encoding参数用法,并展示通过ext4挂载文件限制日志容量的Linux操作方案及权限处理。

限制输出日志的大小有多种实现方式,其中最优雅的做法是直接利用日志轮转(rotate)机制。这种机制在各类编程语言中普遍存在,Python自然也不例外。此外,还可以采用挂载文件的方式指定日志存储位置,由于挂载的文件大小受限,从而间接限制了日志的总容量。另一种手段则是利用系统的 ulimit 命令进行限制。

RotatingFileHandler

RotatingFileHandler 是 logging.handlers 模块中的一个类。在 Python 官方文档中,该类构造函数的示例用法如下所示。


class logging.handlers.RotatingFileHandler(filename, mode=‘a', maxBytes=0, backupCount=0, encoding=None, delay=False)

参数

filename 指定输出的文件名。若使用 Python 3.6 或更高版本,filename 参数支持 Path 对象,这允许以更优雅的方式操作文件路径,该特性是 Python 新增的功能。

mode 指定打开模式,可选值为 'w' 或 'a'。若设置为 'w',每次输出日志时都会覆盖之前存在的日志内容,从第一行开始写入;若设置为 'a',则保留之前的日志内容,并在其后方继续输出新日志。

maxBytes 指定日志文件的最大大小,单位为字节。

backupCount 当日志文件大小达到 maxBytes 设定的阈值时,系统会将旧日志文件重命名,并追加 .1、.2 等后缀以区别于原始 filename,随后在新的 filename 文件第一行开始输出新日志。若该值设为 1,则最多保留一个旧日志备份文件。

encoding 指定字符编码,常用的编码格式为 utf-8。


import logging
from logging.handlers import RotatingFileHandler
log = logging.getLogger()
handler = RotatingFileHandler("test", "a", 4096, 2, "utf-8")
log.addHandler(handler)
#更高级的logging特性
log.setLevel(logging.INFO) #设置过滤的日志等级
formatter = logging.Formatter("%(asctime)s %(levelname)s: %(message)")
log.setFormatter(formatter) #设置日志输出的格式

Mount

首先需要创建文件,并将其格式化为 ext4 文件系统。


dd if=/dev/zero of=./logfs bs=1M count=4
mkfs.ext4 ./logfs

mkdir log
sudo mount -t ext4 ./logfs ./log
python test.py 2>./log/test.log

需要注意的是,此方法可能涉及权限问题。如果 Python 程序的运行权限不足,需要修改挂载后 log 目录的权限,具体操作为使用 sudo chmod 777 -R log 命令。

补充内容:

Python 可以控制日志级别的输出,实现全局限流,控制控制台输出内容,适用于线上配置及简单的日志记录场景。


# coding=utf-8
import logging
import datetime
import os
CONSOLE = True
LEVEL = "DEBUG"
# log/2020-09/2020-09-27_APPLICATION_NAME.log
APPLICATION_NAME = "APPLICATION_NAME"
# 只生成GBK的日志文件
class RecordLog:
 def __init__(self):
  """
  1、控制日志是否在控制台中打印
  2、控制日志输出的级别
  """
  # 设置是否控制台打印
  self._console = CONSOLE
  # 等级字典
  self._level_dict = {'DEBUG':1,'INFO':2,'WARNING':3,'ERROR':4,'CRITICAL':5}
  # 设置当前支持的日志等级
  self._current_level_num = self._level_dict[LEVEL]
 def get_log_file_name(self,):
  """
  创建日志文件夹,创建或调用日志文件,日志存储
  :return: log/log_folder(月份)/log_file(每天的log)
  """
  now = str(datetime.datetime.now())
  log_folder = now[:7]
  log_file = now[:10] + "_" + APPLICATION_NAME + ".log"
  if os.path.exists("log/" + log_folder):
   pass
  else:
   os.makedirs("log/" + log_folder)
  return "log/" + log_folder + "/" + log_file
 def log_content(self, content='开始记录',level="DEBUG"):
  """
  记录日志
  :param content: 记录的内容
  :param level: DEBUG, INFO, WARNING, ERROR, CRITICAL
  :return:
  """
  LOG_FILE_NAME = self.get_log_file_name()
  now1 = datetime.datetime.now()
  now_date = now1.strftime("%Y-%m-%d-%H:%M:%S")
  text = " %s %s -- %s" % (level, now_date, content)
  if level in ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']:
   level_num = self._level_dict[level]
   # 控制台输出
   if self._console:
    print(text)
   logger = logging.getLogger()
   fh = logging.FileHandler(filename=LOG_FILE_NAME, encoding="utf-8", mode="a")
   # formatter = logging.Formatter("%(asctime)s - %(name)s-%(levelname)s %(message)s")
   # fh.setFormatter(formatter)
   logger.addHandler(fh)
   # 设置日志等级
   if "DEBUG" == level and level_num >= self._current_level_num:
    logger.setLevel(logging.DEBUG)
   elif "INFO" == level and level_num >= self._current_level_num:
    logger.setLevel(logging.INFO)
   elif "WARNING" == level and level_num >= self._current_level_num:
    logger.setLevel(logging.WARNING)
   elif "ERROR" == level and level_num >= self._current_level_num:
    logger.setLevel(logging.ERROR)
   else:
    logger.setLevel(logging.CRITICAL)
   logger.info(text)
  else:
   raise Exception('日志等级传参错误: %s ; 正确格式为:DEBUG, INFO, WARNING, ERROR, CRITICAL'%level)
if __name__ == '__main__':
 #
 log = RecordLog()
 log.log_content(level='DEBUG')

以上为个人经验分享,希望能为大家提供参考。欢迎对本站多多支持。如有错误或未考虑周全之处,恳请指正。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。