Python logging模块实现分文件存储的两种方案与权限异常处理

Hazel
Hazel
发布时间:2026-10-15| 4人浏览过
原创

本文详解Python logging模块的分文件存储方案。对比基于时间的TimedRotatingFileHandler与基于大小的RotatingFileHandler,解析atTime与when参数关系。重点解决多进程下日志文件被占用导致的PermissionError,通过设置delay=True或引入concurrent_log_handler库实现安全写入,并提供完整代码示例。

前言:

日志分文件存储方案概述

若采用基础的logging.FileHandler方式记录日志,所有日志信息将集中写入单一文件,这会给后续的日志检索与分析带来不便。本文将介绍两种常见的日志分文件存储策略。其中,delay = True参数可有效规避多进程环境下读取日志时可能出现的权限冲突问题。

基于时间的日志分割:TimedRotatingFileHandler

TimedRotatingFileHandler 根据时间创建日志文件

TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None)

atTime 与 when参数之间的关系

基于大小的日志分割:RotatingFileHandler

RotatingFileHander 根据日志文件大小创建日志文件

RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False)

多进程日志写入权限异常处理

分文件时,PermissionError异常处理

异常信息:

--- Logging error ---
 Traceback (most recent call last):
 '省略部分信息'
 PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。

解决方法:

设置 delay=True使用第三方库 concurrent_log_handler.ConcurrentRotatingFileHandler

完整代码实现与调用示例

代码实现:customer_log.py

import logging
from logging import handlers
from concurrent_log_handler import ConcurrentRotatingFileHandler
def set_basic_logger():
    path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    log_path = path + '/Log/'
    log_file = log_path + 'mockSystem.log'
    err_file = log_path + 'mockSystemErr.log'
    
    # 定制输出格式
    formatter = logging.Formatter(
        '[%(asctime)s] %(filename)s -> %(funcName)s line:%(lineno)d [%(levelname)s] : %(message)s')

    # # 所有日志在一个文件中存储
    # handler = logging.FileHandler(log_file, encoding='utf-8', mode='a+')
    # 按天分文件存储,保存最近30天的日志
    handler = handlers.TimedRotatingFileHandler(log_file, when='d', interval=1, backupCount=30, encoding='utf-8', delay=True)
    # 按文件大小分文件存储,每个文件10字节,保留10个文件
    # handler = handlers.RotatingFileHandler(log_file, maxBytes=10, backupCount=10,
    #                                        encoding='utf-8', delay=True)
    # 按文件大小分文件存储,每个文件10字节,保留10个文件
    # handler = ConcurrentRotatingFileHandler(log_file, maxBytes=10, backupCount=10)
    handler.setLevel(logging.INFO)
    handler.setFormatter(formatter)
    # err_handler = ConcurrentRotatingFileHandler(err_file, encoding='utf-8', mode='a+')  # 输出到err_log文件
    err_handler = handlers.TimedRotatingFileHandler(err_file, when='d', interval=1, backupCount=30,
                                                   encoding='utf-8', delay=True)
    # err_handler = handlers.RotatingFileHandler(err_file, maxBytes=10, backupCount=10,
    #                                            encoding='utf-8', delay=True)
    # err_handler = ConcurrentRotatingFileHandler(err_file, maxBytes=10, backupCount=10)
    err_handler.setLevel(logging.WARNING)
    err_handler.setFormatter(formatter)

    logging.basicConfig(
        level=logging.DEBUG,
        format='[%(asctime)s] %(filename)s -> %(funcName)s line:%(lineno)d [%(levelname)s] : %(message)s',
        handlers=[handler, err_handler]
    )

在项目主程序中使用时:main.py

from customer_log imoprt set_basic_logger
import mu
set_basic_logger()
mu.show_cur_info()

在项目其他模块使用时:mu.py

import logging
def show_cur_info():
	msg = 'dddddd'
	print(msg)
	logging.info(msg

到此这篇关于python logging模块的分文件存放详析的文章就介绍到这了,更多相关python logging模块内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

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

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 算法库。