我在代码中使用
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.")
Is there anything I can do to make sure that my loggers are logging? I'd like to keep using the builtin logging functionality, but I'm also open to using some lib for that.
Alembic 的行为会改变 Python logging 模块的根处理器的级别,这就是你的日志记录在 Alembic 命令运行后停止工作的原因。
你可以通过以下两种方式解决这个问题:
1. 在 Alembic 命令后重置日志级别:
在调用 Alembic 命令后,显式地将根记录器的日志级别设置回你想要的级别。
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 配置
alembic_config = AlembicConfig("alembic.ini")
alembic_config.attributes["sqlalchemy.url"] = connection_string
alembic.command.upgrade(alembic_config, "head", tag="from_app")
# 重置根记录器的日志级别
logging.getLogger().setLevel(logging.DEBUG)
logger.debug("Terminating app.")
2. 使用独立的记录器配置:
不要依赖根记录器,而是为你的应用程序创建一个单独的记录器,并对其进行配置。这将使你的记录器配置独立于 Alembic 或其他库可能进行的任何更改。
import logging
import alembic.command
from alembic.config import Config as AlembicConfig
# 创建和配置一个独立的记录器
logger = logging.getLogger("app")
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
logger.debug("Applying alembic migrations.")
# Alembic 配置
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.")
这两种方法都可以解决你的问题,并确保在 Alembic 命令运行后日志记录继续正常工作。
标签:python,python-3.x,logging,alembic From: 78780118