python - Flask 跨多个模块进行日志记录

标签 python logging flask

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

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

我的API在main.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。我感觉我错过了一些东西,但不明白是什么。任何帮助表示赞赏。

最佳答案

您的库确实有不同的记录器名称。对于两者,您需要具有相同的记录器名称。例如,参见the logging cookbook .

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

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

main.py

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")

关于python - Flask 跨多个模块进行日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51852997/

相关文章:

python - Django 'AsgiRequest' 对象没有属性 'content_type'

python - 如何从 Web 服务器日志文件中提取数据并解析请求行部分?

Python 值错误 : No JSON object could be decoded

python BeautifulSoup 在表中查找某些内容

node.js - 如何解析 Node 中的大型分隔文本文件

java - 将错误记录到 stderr 和调试,使用 log4j 将信息记录到 stdout

python - logging.info 和 logging.getLogger().info 有什么区别?

python - 如何在 Flask 中处理 JSON?

flask - 从flask-sqlalchemy db获取所有模型

python - 我可以在 @app.before_request 中为我的 flask 请求对象附加一个值并将其转发给端点 View 函数吗?