【问题标题】:Permission error when initialising RotatingFileHandler logging in Flask app factory在 Flask 应用程序工厂中初始化 RotatingFileHandler 日志记录时出现权限错误
【发布时间】:2021-04-17 16:39:03
【问题描述】:

关于 SO 有很多类似的问题,但我没有一个完全适合我的情况。

我正在我的应用程序工厂中设置登录,如下所示:

__init__.py

import os
from flask import Flask
from logging.config import dictConfig
LOG_FOLDER = f'{os.path.dirname(os.path.abspath(__file__))}/logs'

def create_app(test_config=None):
    # Setup logging
    # Make log folder if it doesn't exist
    try:
        os.makedirs(LOG_FOLDER)
        print("created logs folder")
    except OSError:
        print("log folder already exists")
        pass

    dictConfig({
    "version": 1,
    "handlers": {
        "fileHandler": {
            "class": "logging.handlers.RotatingFileHandler",
            "formatter": "myFormatter",
            "filename": f"{LOG_FOLDER}/flask.log",
            "maxBytes": 500,
            "backupCount": 5
        },
        "werkzeugFileHandler": {
            "class": "logging.handlers.RotatingFileHandler",
            "formatter": "myFormatter",
            "filename": f"{LOG_FOLDER}/werkzeug.log",
            "maxBytes": 500,
            "backupCount": 5
        },
        "console": {
            "class": "logging.StreamHandler",
            "formatter": "myFormatter"
        }
    },
    "loggers": {
        APP_NAME: {
            "handlers": ["fileHandler", "console"],
            "level": "INFO",
        },
        "werkzeug": {
            "level": "INFO",
            "handlers": ["werkzeugFileHandler", "console"],
        }
    },

    "formatters": {
        "myFormatter": {
            "format": "[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s"
        }
    }
})

    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)

    <remainder omitted>

并像这样在我的其他类中访问记录器:

foo.py

from flask import Flask
from definitions import APP_NAME

app = Flask(APP_NAME)

app.logger.info("blah")

但是当 RotatingFileHandler 将 flask.log 重命名为 flask.log.1 时,我收到了我在许多 SO 帖子中看到的这个错误:

PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\user\\project_root\\logs\\flask.log' -> 'C:\\Users\\user\\project_root\\logs\\flask.log.1'

我在本地以开发模式运行烧瓶服务器,使用flask run cli 命令。

需要注意的另一件事是,当烧瓶服务器运行时,我无法手动修改(即删除或重命名)日志文件,所以似乎让服务器运行的仅仅是锁定文件不被修改?初始化 __init__.py 中的日志记录是错误的,还是我遗漏了什么?

【问题讨论】:

    标签: python flask logging


    【解决方案1】:

    我认为这是与PermissionError when using python 3.3.4 and RotatingFileHandler 重复的问题。但只是转发我的答案:

    花了半天时间解决了我的问题。

    我的工作解决方案是使用 https://pypi.org/project/concurrent-log-handler/ 而不是 RotatingFileHandler。在像 Flask 应用这样的多线程场景中,当我们旋转达到最大大小的日志文件时,会引发 PermissionError。

    安装pypiwin32 以摆脱No Module name win32con 错误。

    感谢https://www.programmersought.com/article/43941158027/

    【讨论】:

      【解决方案2】:

      尝试在您的处理程序中将 delay 参数更改为 True(在我的例子中,我使用了 TimeRotatingFileHandler)。

      https://stackoverflow.com/a/69378029/15036810

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 1970-01-01
        • 2021-08-06
        • 2019-03-08
        • 1970-01-01
        • 2021-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多