Description
What problem would the feature you're requesting solve? Please describe.
The Azure Function host doesn't catch and display errors during startup or dependency injection of function dependencies. Instead a generic error is shown (see below).
If I try to catch and log errors myself, then I can't assume Application Insights to be configured, so I would need to log to the console. But if I do that, then nothing is logged, not even if I inspect the filesystem logs, where nothing is ever written.
Could you please describe how to catch and log startup and dependency injection errors, so I can inspect them, including stack traces?
The Azure Function host won't let me log information in Program.cs, when creating and running a HostBuilder
in Azure.
Describe the solution you'd like
I would like to be provided with a stack trace of the exception and/or being able to catch and log such errors myself to the console.
Describe alternatives you've considered
I don't think I have any alternatives
Additional context
Azure Functions host: 4.x
Language: .NET 8 (dotnet-isolated)
Service plan: Linux / Consumption plan
Azure Function App Test/Run Error:
Program.cs:
var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
var logger = loggerFactory.CreateLogger("Startup");
logger.LogInformation("The application is starting...");
var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureAppConfiguration(builder =>
{
var environment = Environment.GetEnvironmentVariable("ENVIRONMENT") ?? "development";
builder.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
})
.ConfigureServices((context, services) =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
services.AddDbContext<AssetOwnershipContext>((sp, options) =>
{
var logger = sp.GetRequiredService<ILogger>();
var connectionString = context.Configuration.GetConnectionString("SqlServer") ?? throw new ConfigurationErrorsException("Connection string not found");
logger.LogInformation("Using connection string: {connectionString}", connectionString);
options.UseSqlServer(connectionString);
});
services.AddScoped<IApplicationService, ApplicationService>();
services.AddScoped<IEmailDispatcher, EmailDispatcher>();
services.AddTransient<IAssetOwnershipRepository, AssetOwnershipRepository>();
services.AddSingleton<GraphServiceClient>(sp =>
new GraphServiceClient(
new DefaultAzureCredential(new DefaultAzureCredentialOptions()
{
ExcludeSharedTokenCacheCredential = true
})
)
);
})
.Build();
host.Run();