使用try / except和DefaultAzureCredential()
记录和处理异常的示例方法有哪些?
示例:
在Python Azure函数中使用DefaultAzureCredential()
时,它会生成一些WARNING
消息,并且凭证链中的.get_token
方法之一会成功。
我想记录哪些成功和哪些失败。
WARNING:azure.identity._internal.decorators:EnvironmentCredential.get_token failed: EnvironmentCredential authentication unavailable. Environment variables are not fully configured.
WARNING:azure.identity._internal.decorators:ManagedIdentityCredential.get_token failed: ManagedIdentityCredential authentication unavailable, no managed identity endpoint found.
WARNING:azure.identity._internal.decorators:SharedTokenCacheCredential.get_token failed: SharedTokenCacheCredential authentication unavailable. No accounts were found in the cache.
WARNING:azure.identity._internal.decorators:VisualStudioCodeCredential.get_token failed: Failed to get Azure user details from Visual Studio Code.
然后它成功了,但是没有消息表明哪个成功了。在这种情况下,请在VS Code的.ipynb
文件中运行摘要。
在生产环境中使用DefaultAzureCredential()
时如何记录和处理错误?
寻找类似的例子:
try:
credentials = DefaultAzureCredential()
logging.info(f'<whichever>.get_token succeeded')
except Error1 as e1:
logging.error(f'EnvironmentCredential.get_token failed: EnvironmentCredential authentication unavailable. Environment variables are not fully configured.', e1)
except Error2 as e2:
logging.error(f'ManagedIdentityCredential.get_token failed: ManagedIdentityCredential authentication unavailable, no managed identity endpoint found.', e2)
...<etc>
答案 0 :(得分:2)
只是为了用更多细节补充已接受的答案,让我补充一点,DefaultAzureCredential
确实记录了此信息。例如,如果您启用 INFO 级别的日志记录:
import logging
from azure.identity import DefaultAzureCredential
logger = logging.getLogger('azure.identity')
logger.setLevel(logging.INFO)
handler = logging.StreamHandler(stream=sys.stdout)
formatter = logging.Formatter('[%(levelname)s %(name)s] %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
您将看到来自 DefaultAzureCredential
的类似日志消息:
[INFO] DefaultAzureCredential - EnvironmentCredential is unavailable
[INFO] DefaultAzureCredential - ManagedIdentityCredential is unavailable
[INFO] DefaultAzureCredential - SharedTokenCacheCredential is unavailable
[INFO] DefaultAzureCredential acquired a token from VisualStudioCodeCredential
您只会在 DefaultAzureCredential
实例第一次获取令牌时看到失败的尝试记录。一旦其组成凭证之一提供了令牌,它就会专门使用该凭证。所以这个特定的 DefaultAzureCredential
将始终通过 Visual Studio Code 进行身份验证,并且在日志中您会在每次这样做时看到此消息:
[INFO] DefaultAzureCredential acquired a token from VisualStudioCodeCredential
答案 1 :(得分:1)
我可以通过几种方法来解决这个问题,但是没有一种方法特别漂亮。冒一个天真的建议的风险,如果您希望对顺序的工作有一个较细的了解,则可以采用与示例中使用here列出的组件凭据勾勒出的示例类似的方法:
for credential in [EnvironmentCredential, ManagedIdentityCredential, ...]:
try:
credentials = credential()
# Validate credential functionality...
logging.info('{}.get_token succeeded'.format(credential))
except Error1 as e1:
logging.error('{} failed due to {}'.format(credential, e1))
我之所以建议这样做,是因为看起来ChainedCredential
源here似乎并没有以一种易于访问的方式公开您想要的内容(历史记录已建立,但仅在日志消息中使用)
更多的“自包含”方法可能涉及创建自定义包装,该包装在运行get_token调用列表时基本上可以完成ChainedCredential
对DefaultAzureCredential
的作用,但是具有导出成功历史记录的更多功能,您可能会从我在2中链接的代码中窃取代码,并做一些与the DefaultAzureCredential logic直接可比的事情,但是到最后,这都是上面示例的所有同构。
如果我误解了问题的某些方面或您的要求/约束,请毫不犹豫地大喊大叫;如果您需要与我们联系,请随时与我们联系on our github(全面披露,是其他Python Azure SDK的维护者)