python - 使用 Plotly 仪表板时 Flask 日志条目重复

标签 python flask plotly-dash

将 Plotly 仪表板引入我的 Flask 应用程序时,我看到了意外行为。每个 Plotly 仪表板都会导致 Flask 日志条目被复制。

例如,如果我将两个 Plotly 仪表板附加到我的 Flask 应用程序,日志条目(例如 current_app.logger.info('hi'))将在我的日志中出现三次。如果我删除 Plotly 仪表板,日志条目会出现一次,这是预期的行为。

我尝试通过 app.logger.handlers.clear() 和设置 dictConfigdisable_existing_loggers< 删除我的日志配置代码中的现有处理程序True,两者都不会记录任何内容。我也尝试过使用单例方法来配置记录器(再次使用 dictConfig),但我仍然看到日志条目重复多次。

如何防止 Plotly 仪表板导致重复的日志条目?

更新:

这是 Dash 应用程序初始化方式的简化版本:

def register_dashapp(app):
    from dashboards.dash_files.my_dash import (
        define_layout,
        define_callbacks,
    )
    my_dashapp = dash.Dash(__name__,
                         server=app,
                         url_base_pathname='/my_dash/',
                         assets_folder="../dashboards/foo/bar/assets",
                         )
    with app.app_context():
        my_dashapp.title = "Test"
        define_layout(my_dashapp)
        define_callbacks(my_dashapp)

def create_app():
    app = Flask(__name__, instance_relative_config=False)
    app.config.from_object('config.Config')

    with app.app_context():
        register_extensions(app)
        app.register_blueprint(main)
        register_dash_app(app)
        return app

最佳答案

我遇到了一个日志重复问题并使用相同的 HasHandlers 逻辑解决了它,但是我调用日志的方式略有不同。这需要 python arrow 库,我发现它在大多数用例中优于 datetime。

我在我的主 app.py 或 _init_.py 文件中定义了 site_logger。

# define logger
def site_logger(log_name):
    now = arrow.now('US/Eastern').format('YYYY_MM_DD')
    handler = logging.FileHandler('logs/' + log_name + '_' + now + '.log')
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(name)s: %(message)s')
    handler.setFormatter(formatter)
    logger = logging.getLogger(log_name)
    logger.setLevel("DEBUG")
    if logger.hasHandlers():
        logger.handlers.clear()
    logger.addHandler(handler)
    logger.propagate = False
    return logger

然后我在任何 views.py 文件或函数中按以下方式调用记录器,您也可以将记录器传递给您在 views.py 中调用的函数,将函数的日志结果保存在正确的页面文件中被调用。

from app import site_logger
logger = site_logger('page_name')

然后我可以用通常的方式记录事件。下面是两个示例,在记录器中使用 f 字符串是将变量轻松传递到日志数据的好方法。

logger.info(f'{user} logged in successfully')
logger.warning(f'{user} password failure!')

这将提供统一命名的日志处理程序和日志文件,您可以更轻松地追溯到所进行的页面或函数调用。当 arrow.now('timezome') 值旋转到第二天时,日期格式的文件应该自动旋转。

关于python - 使用 Plotly 仪表板时 Flask 日志条目重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59776874/

相关文章:

python - 使用 render_template 有条件地呈现 HTML 片段

python - 将缓存 token 与 Spotipy for Spotify 一起使用时遇到问题?

mysql - "from flaskext.mysql import MySQL"导致服务器显示 502 bad gateway

python - 需要帮助将从 Salesforce 请求的 Salesforce 数据转换为内部仪表板的 Dataframe

python - 在 Flask 响应中设置 HTTP 状态文本

python - Django 与 Heroku 上的 PostgreSQL 应用程序不同步

python - 将颜色映射到 plotly go.Pie 图表中的标签

python - 同一行的不同标记颜色

python - pandas DataFrame 的本质

python - 使用 python 请求进行 Twitter 抓取时如何执行 oauth