首页 > 解决方案 > 跨多个模块的 Flask 日志记录

问题描述

我在 Flask 中有以下目录结构,我正在尝试将日志记录添加到该系统。我的 API 在 API 中定义main.pybackend.py提供了一些后端逻辑。

├── README.md
├── __init__.py
├── main.py
├── module
│   ├── __init__.py
│   └── backend.py

我的 APImain.py在文件中定义和记录相关组件如下:

from logging.config import dictConfig
import logging
from module import backend

log_level = "DEBUG"
LOGFILENAME = "flask.log"
dictConfig({
    'version': 1,
    'formatters': {'default': {
        'format': '[%(asctime)s] {%(pathname)s:%(funcName)s:%(lineno)d} %(levelname)s - %(message)s',
    }},
    'handlers': {'default': {
                'level': 'DEBUG',
                'formatter': 'default',
                'class': 'logging.handlers.RotatingFileHandler',
                'filename': LOGFILENAME,
                'maxBytes': 5000000,
                'backupCount': 10
            }},
    'root': {
        'level': log_level,
        'handlers': ['default']
    }
})

app = Flask(__name__)
logger = logging.getLogger(__name__)

@app.route('/')
def hello():
    logger.debug("DEBUG: Inside the home function")
    logger.info("INFO: Inside the home function")
    backend.test()
    return "Welcome"

日志在 main.py 中按预期工作。根据log_level,日志被写入LOGFILENAME.

当我尝试通过 backend.py 中的以下步骤启用日志记录时,会出现问题。

import logging
logger = logging.getLogger(__name__)

def test():
    logger.info("info test")
    logger.debug("debug test")

我没有看到任何日志backend.py被写入flask.log. 我觉得我错过了一些东西,但不明白是什么。任何帮助表示赞赏。

标签: pythonloggingflask

解决方案


您的库确实有不同的记录器名称。对于两者,您需要具有相同的记录器名称。例如,参见日志记录手册

最佳实践是您创建自己的日志记录层次结构,例如 main.py ( logger = logging.getLogger("myapp")) 中的“myapp”,并在 backend.py 中附加到它,例如myapp.backend( logger = logging.getLogger(".".join("myapp", __name__)).

在下面找到您的 main.py 和 backend.py 的略微修改版本。我已经删除了 Flask 部分。我想这不会影响日志记录机制。

主文件

import logging.config

from module import backend

dict_config = {
    'version': 1,
    'formatters': {
        'default': {
            'format': '[%(asctime)s] {%(pathname)s:%(funcName)s:%(lineno)d} %(levelname)s - %(message)s',
        }
    },
    'handlers': {'default': {
        'level': 'DEBUG',
        'formatter': 'default',
        'class': 'logging.handlers.RotatingFileHandler',
        'filename': "test.log",
        'maxBytes': 5000000,
        'backupCount': 10
    },
        'console': {
            'class': 'logging.StreamHandler',
            'level': 'DEBUG',
            'formatter': 'default',
        },
    },
    'loggers': {
        'myapp': {
            'handlers': ["default"],
            'level': 'DEBUG',
        },
    },
    'root': {
        'handlers': ["console"],
        'level': 'DEBUG',
    },
}

print(__name__)
logger = logging.getLogger("myapp")
logging.config.dictConfig(dict_config)


def hello():
    logger.debug("DEBUG: Inside the home function")
    logger.info("INFO: Inside the home function")
    backend.test()
    return "Welcome"


print(hello())

后端.py

import logging
logger = logging.getLogger("myapp")

def test():
    logger.info("info test")
    logger.debug("debug test")

推荐阅读