从代码调用 alembic 命令后,Python 记录器不再记录日志

问题描述 投票:0回答:1

我在代码中使用

alembic
在应用程序启动时应用数据库迁移。我还使用 Python 的内置
logging
lib 来登录终端。应用迁移后(或运行任何打印到
alembic
stdout
命令),我的记录器停止工作。

代码:

import logging

import alembic.command
from alembic.config import Config as AlembicConfig

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger("app")

logger.debug("Applying alembic migrations.")

alembic_config = AlembicConfig("alembic.ini")
alembic_config.attributes["sqlalchemy.url"] = connection_string
alembic.command.upgrade(alembic_config, "head", tag="from_app")

logger.debug("Terminating app.")

预期输出:

DEBUG:app:Applying alembic migrations.
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
DEBUG:app:Terminating app.

实际产量:

DEBUG:app:Applying alembic migrations.
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.

最后一行缺失。

我尝试在应用迁移后再次设置日志级别(我想它可能更改了根记录器日志级别):

...
alembic.command.upgrade(alembic_config, "head", tag="from_app")

logger.setLevel(logging.DEBUG)
logger.debug("Terminating app.")

事实上,即使

logger.critical("blah")
也不会再记录任何内容。

我还尝试再次应用基本配置并再次获取记录器:

...
alembic.command.upgrade(alembic_config, "head", tag="from_app")

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger("app")
logger.debug("Terminating app.")

但无济于事。甚至根记录器也不再记录了:

...
alembic.command.upgrade(alembic_config, "head", tag="from_app")

logging.basicConfig(level=logging.DEBUG)
logging.debug("Terminating app.")

我可以做些什么来确保我的记录器正在记录?我想继续使用内置的日志记录功能,但我也愿意为此使用一些库。

python python-3.x logging
1个回答
0
投票

答案将在您的

alembic.ini
文件中找到。

您正在运行一个旨在作为脚本而不是 API 调用的命令,因此 alembic 使用 logging.fileConfig

 
配置自己的日志记录,默认情况下使用
disable_existing_loggers=True
。该选项将禁用任何现有的非根记录器,除非它们或其祖先在日志记录配置文件中明确命名。

因此,阻力最小的方法就是在那里设置日志配置。

alembic.ini
中将有一个包含日志配置的部分 - 查找
[loggers]
部分标题。您需要修改内容,以便您自己的记录器保持可见。

© www.soinside.com 2019 - 2024. All rights reserved.