如何在mongoengine的Flask项目中使用pymongo.monitoring

2024-10-04 11:28:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图通过flask和mongoengine向一个简单的REST web服务添加一些监控功能,但我发现我对imports和mongoengine如何在flask应用程序中工作缺乏了解。 我正在关注pymongo关于监控的文档:https://pymongo.readthedocs.io/en/3.7.2/api/pymongo/monitoring.html

我在单独的文件中定义了以下CommandListener:

import logging
from pymongo import monitoring

log = logging.getLogger('my_logger')


class CommandLogger(monitoring.CommandListener):
    def started(self, event):
        log.debug("Command {0.command_name} with request id "
                   "{0.request_id} started on server "
                   "{0.connection_id}".format(event))

monitoring.register(CommandLogger())

我创建了一个application_builder.py文件来创建我的flask应用程序,代码如下所示:

from flask_restful import Api
from flask import Flask

from command_logger import CommandLogger # <----
from db import initialize_db
from routes import initialize_routes

def create_app():
    app = Flask(__name__)
    api = Api(app)
    initialize_db(app)
    initialize_routes(api)
    return app

仅当我在application_builder.py中导入:CommandLogger时,监控才起作用。我想了解这里发生了什么,导入如何影响监控注册

另外,我想将monitoring.register(CommandLogger())提取为函数,并在代码的后期调用它,比如def register(): monitoring.register(CommandLogger()) 但这似乎不起作用,“注册”只在与CommandLogger类位于同一个文件中时起作用


Tags: 文件fromimportregisterapiidappflask
2条回答

这对我有用。我只是以与其他模块相同的方式初始化/注册它,以避免循环导入

# admin/logger.py

import logging
from pymongo import monitoring

log = logging.getLogger()
log.setLevel(logging.DEBUG)
logging.basicConfig(level=logging.DEBUG)


class CommandLogger(monitoring.CommandListener):

    # def methods... 

class ServerLogger(monitoring.ServerListener):
    
    # def methods

class HeartbeatLogger(monitoring.ServerHeartbeatListener):
   
   # def methods

def initialize_logger():
    monitoring.register(CommandLogger())
    monitoring.register(ServerLogger())
    monitoring.register(HeartbeatLogger())
    monitoring.register(TopologyLogger())


# /app.py

from flask import Flask

from admin.toolbar import initialize_debugtoolbar
from admin.admin import initialize_admin
from admin.views import initialize_views
from admin.logger import initialize_logger
from database.db import initialize_db
from flask_restful import Api
from resources.errors import errors


app = Flask(__name__)

# imports requiring app
from resources.routes import initialize_routes

api = Api(app, errors=errors)

# Logger before db
initialize_logger()

# Database and Routes
initialize_db(app)
initialize_routes(api)

# Admin and Development
initialize_admin(app)
initialize_views()
initialize_debugtoolbar(app)


# /run.py

from app import app

app.run(debug=True)

然后在任何模块中

from admin.logger import log
from db.models import User

# inside some class/view/queryset or however your objects are written...
log.info('Saving an item through MongoEngine...')
User(name='Foo').save()

我现在想弄清楚的是如何将Flask DebuggerToolbar的日志面板和来自这些监听器的监控消息集成在一起

从MongoEngine的doc来看,在连接MongoEngine之前注册侦听器似乎很重要

To use pymongo.monitoring with MongoEngine, you need to make sure that you are registering the listeners before establishing the database connection (i.e calling connect)

相关问题 更多 >