我有一个 Azure Function 应用程序,其中包含以下代码,该代码是从
program.cs
HostBuilder().ConfigureServices
: 调用的
if (string.IsNullOrEmpty(config[key]))
{
var errorMessage = $"Configuration key '{key}' is missing or empty.";
Console.WriteLine(errorMessage); // this isn't shown on the console ?!
throw new InvalidOperationException(errorMessage); // if I remove this, then I see the console message, but I want an exception raised.
}
这会检查一些基本配置设置,并向下一个开发人员显示他们在
local.settings.json
中缺少的内容,但是控制台消息不会显示。
通知用户并登录 Azure 缺少什么内容的最佳方式是什么?
这是我到目前为止所学到的
启动时发生的异常不会记录到控制台或应用程序洞察中,所以...
在本地主机上,您可以调试并查看哪里发生异常。
在 Azure 中:登录 Azure 门户,导航至 Function App > 诊断并解决问题
以上基于:https://stackoverflow.com/a/62688703/74449
错误可能会“缓存”在门户中,请在此处查看如何清除它们:https://stackoverflow.com/a/76232621/74449
简化示例
该项目以 .NET 8.0 为目标,
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
using System;
using Microsoft.Extensions.Hosting;
var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureServices((context, services) =>
{
var errorMessage = $"Oh no";
Console.WriteLine(errorMessage); // this isn't shown on the console ?!
throw new InvalidOperationException(errorMessage);
})
.Build();
host.Run();
给出这个控制台日志:
Azure Functions Core Tools
Core Tools Version: 4.0.6280 Commit hash: N/A +421f0144b42047aa289ce691dc6db4fc8b6143e6 (64-bit)
Function Runtime Version: 4.834.3.22875
[2024-09-18T03:26:05.944Z] Found C:\Repos\__redacted__\redacted.csproj. Using for user secrets file configuration.
C:\Program Files\dotnet\dotnet.exe (process 15024) exited with code -1.
Press any key to close this window . . .
如果我将
throw new InvalidOperationException(errorMessage)
更改为 return
那么日志将显示以下内容:
Azure Functions Core Tools
Core Tools Version: 4.0.6280 Commit hash: N/A +421f0144b42047aa289ce691dc6db4fc8b6143e6 (64-bit)
Function Runtime Version: 4.834.3.22875
[2024-09-18T03:30:06.504Z] Found C:\Repos\__redacted__\redacted.csproj. Using for user secrets file configuration.
[2024-09-18T03:30:09.835Z] Azure Functions .NET Worker (PID: 4448) initialized in debug mode. Waiting for debugger to attach...
[2024-09-18T03:30:09.835Z] Oh no
[2024-09-18T03:30:09.899Z] Worker process started and initialized.
... etc...
在独立的Azure函数中,函数从Program.cs开始,如果我们从program.cs抛出异常,部署后在本地或Azure中运行时它将不会记录:
在本地,按继续后不会开始运行。
但是,如果您想记录该错误并运行您使用的其余函数,可以在 Program.cs 下面:
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
var rith = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureServices((context, rit) =>
{
rit.AddLogging();
})
.ConfigureLogging(ss =>
{
ss.AddConsole();
})
.Build();
var ricfg = rith.Services.GetRequiredService<IConfiguration>();
var rilg = rith.Services.GetRequiredService<ILogger<Program>>();
var ri = "xxx";
if (string.IsNullOrEmpty(ricfg[ri]))
{
var errorMessage = $"Hello Rithwik, key '{ri}' is not there";
rilg.LogError(errorMessage);
}
rith.Run();
因此,根据上述观察,我得出的结论是,如果 Program.cs 抛出任何异常,则不会登录异常,并且该功能在部署后也将可用。只有 Program.cs 之外的异常才有效。