1

我在将日志发送到 Azure Application Insights 时遇到很大困难。当 AzureLogHandler 初始化并添加到 app.py 中的子记录器,它可以正常工作。但是,当我去创建一个新的记录器实例时,问题开始于app.py之外,日志不会发送到 Azure。样本:

# app.py
logger = logging.getLogger(__name__)
logger.addHandler(AzureLogHandler(connection_string=""))

logger.info("This is emitted")


# main.py
logger = logging.getLogger(__name__)
logger.addHandler(AzureLogHandler(connection_string=""))

logger.info("This is NOT emitted")

我设法让它工作的唯一方法是导入我在app.py中创建的记录器实例,这是次优的:

# sub-optimal - does not permit me to create a log hierarchy
# main.py
from app.py import logger

logger.info("This works but restricts me")

理想情况下,我希望在尽可能少地干扰项目的情况下实现 opencensus AzureLogHandler,例如在开始时将 AzureLogHandler 添加到根记录器,然后派生所有子记录器,而无需单独附加处理程序:

# app.py
logging.basicConfig(handlers=[AzurelogHandler(connection_string=""))
logger = logging.getLogger(__name__)
logger.debug("so simple!")
# main.py
logger = logging.getLogger(__name__)
logger.debug("so simple!")

注意:该解决方案必须与异步 FastAPI 一起使用。这似乎使事情变得复杂,因为我已经为 Flask 和其他服务很好地实现了这个。

谢谢!

4

1 回答 1

0

记录器存在于层次结构中,顶部有一个根记录器(使用 logging.getLogger() 检索,无参数)。每个记录器都从其父级继承配置,记录器本身的任何配置都会覆盖继承的配置。在这种情况下,您永远不会配置根记录器,只配置 app_py 中特定于模块的记录器。因此,main_py 中的特定于模块的记录器永远不会被配置。

最简单的解决方法可能是使用 main_py 中的 logging.basicConfig 来设置您希望所有记录器共享的选项。

最佳实践是在 main 而不是 app_py 中使用 root logger,在 main_py 中启动之后,您可以将其用作默认 logger。

如果这不能解决您的问题,您可以参考这个网站和 SO Thread

于 2022-01-06T12:24:36.393 回答