我在代码中使用
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.")
我可以做些什么来确保我的记录器正在记录?我想继续使用内置的日志记录功能,但我也愿意为此使用一些库。
答案将在您的
alembic.ini
文件中找到。
您正在运行一个旨在作为脚本而不是 API 调用的命令,因此 alembic 使用 logging.fileConfig
配置自己的日志记录,默认情况下使用
disable_existing_loggers=True
。该选项将禁用任何现有的非根记录器,除非它们或其祖先在日志记录配置文件中明确命名。
因此,阻力最小的方法就是在那里设置日志配置。
alembic.ini
中将有一个包含日志配置的部分 - 查找 [loggers]
部分标题。您需要修改内容,以便您自己的记录器保持可见。