首页 > 编程问答 >从代码调用 alembic 命令后,Python 记录器不再记录

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

时间:2024-07-23 16:08:04浏览次数:9  
标签:python python-3.x logging alembic

我在代码中使用 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

相关文章

  • python 使用 random模块生成随机测试数据
    前言python中可以使用random模块生成随机测试数据常用函数说明random.seed(a)设置初始化随机种子,可输出相同随机数序列;a取整数或浮点数,不设置时默认以系统时间为种子random.random()生成一个0.0到1.0之间的随机浮点数random.uniform(a,b)生成一个[a,b]之间......
  • Python 上债券的内部收益率
    在Excel中,有一个公式(IRR.Payment:https://support.microsoft.com/fr-fr/office/fonction-tri-paiements-de1242ec-6477-445b-b11b-a303ad9adc9d)计算债券的IRR。我正在尝试在python算法上重现这一点,以便能够在我的代码中计算它。我在网上找到了这段代码:importnumpy......
  • 使用Python连接ftps服务器时nlst返回错误
    我可以使用TotalCommander登录服务器:ftps://publishedprices.co.il用户名:“奥舍拉德”密码为空并带有lftp-uosherad:publishedprices.co.il但是当我尝试登录并使用Python获取文件列表时nlst函数返回超时代码:fromftplibimportFTP_TLS......
  • 在我的 python 代码中,我无法使用 slixmpp 连接到 Openfire 服务器
    在我的python代码中,我无法连接到Openfire服务器。我想连接到OpenFire服务器我的代码是importthreadingimporttkinterastkfromtkinterimportsimpledialog,scrolledtextimportjsonimportloggingimportasynciofromslixmppimportClientXMPPcla......
  • 如何在Python中获取字符的unicode?
    想要获取中文或越南语的汉名和日文字符的unicode我已经尝试过这些代码text="......
  • 三种语言实现计算逆序对的数量(C++/Python/Java)
    题目给定一个长度为......
  • python项目中__init__.py是什么文件有什么作用
    __init__.py 文件在Python项目中的作用主要是将目录标识为一个Python包。它在包的初始化过程中起到了重要作用。具体来说,__init__.py 文件有以下几个功能:1.标识包:-当一个目录中包含 __init__.py 文件时,这个目录就被视为一个Python包。这样,Python解释器就能够识别......
  • 从零开始构建你的第一个Python Web应用
    在本文中,我们将带领你从零开始构建一个简单的PythonWeb应用。不需要任何先验知识,我们会一步步地指导你完成设置、框架选择、代码编写到部署的整个过程。无论你是Web开发新手还是希望扩展技能的老手,这篇文章都将为你提供一个实践操作的起点。一、前言随着互联网技术的飞速......
  • Python中的global关键字是如何工作的?
    在Python中,global关键字扮演着特殊而重要的角色,它主要用于在函数内部声明全局变量。理解global关键字的工作原理,首先需要明确Python中变量作用域的概念,以及为什么需要global关键字。下面,我将详细解释global关键字的工作机制,包括其作用、使用场景、注意事项,以及它在Python编......
  • Python中enumerate()函数
    Python中enumerate()函数的作用是什么?enumerate()函数在Python中是一个非常有用的内置函数,它用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中。使用enumerate()可以使你在循环中获取每个元素的同时,也能......