我有一个Azure Function v2,如下所示:
public sealed class FindAccountFunction
{
private readonly IAccountWorkflow m_accountWorkflow;
public FindAccountFunction(ILogger<FindAccountFunction> logger)
{
m_logger = logger;
}
[FunctionName("FindAccount")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "GET", Route = "v1/accounts/")] HttpRequest httpRequest)
{
// Do stuff.
m_logger.LogInformation("Duuuddde");
}
}
如different question所述,记录器正在注入:
[assembly: WebJobsStartup(typeof(Startup))]
public sealed class Startup : IWebJobsStartup
{
public void Configure(IWebJobsBuilder webJobsBuilder)
{
// Registers other services...
// -- UPDATE - The AddLogging must be called here --
webJobsBuilder.Services.AddLogging();
}
}
然后我通过HTTP请求触发我的函数并转到Azure DevOps上的函数门户以查看日志是否实际打印:
我只看到指示该功能成功运行的日志,但是我没有看到我的日志。
题
为什么我的Azure Function v2中注入的ILogger
错过了APPINSIGHTS_INSTRUMENTATIONKEY
?
更新
当我查看注入的ILogger
时,我可以看到Application Insights Provider的InstrumentationKey未设置。这同样适用于注射ILogger的ctor,也适用于Run方法中注入的ILogger
。
对于我的本地测试,检测密钥在local.settings.json
文件中声明:
我对不同的设置变种感到困惑(ILogger
vs ILoggerFactory
vs其他东西)。
在我的Startup
类中,调用AddLogging
(最低级别与否,只要它在此处或host.json
文件中定义)是正确的。
using InjectionHttpClientFactory;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
[assembly: WebJobsStartup(typeof(Startup))]
namespace InjectionHttpClientFactory
{
public sealed class Startup : IWebJobsStartup
{
public void Configure(IWebJobsBuilder webJobsBuilder)
{
webJobsBuilder.Services.AddLogging();
}
}
}
在Azure函数中,如果我将HttpClient
指定为参数,则会出错:
Microsoft.Extensions.DependencyInjection.Abstractions:尝试激活“XXX”时无法解析类型“Microsoft.Extensions.Logging.ILogger”的服务
但是,如果我指定ILoggerFactory
,它确实有效。以某种方式为空的检测键属性没有任何影响。
我更新了host.json
文件,以包含具有最低严重性级别的日志记录信息以及Application Insights的配置信息:
{
"version": "2.0",
"logging": {
"fileLoggingMode": "debugOnly",
"logLevel": {
"default": "Trace"
},
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"maxTelemetryItemsPerSecond" : 5
}
}
}
}
更新
正如评论中所提到的,微软发布了一个update,它引入了FunctionsStartup
类,这应该是这样做的首选方式。
[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddHttpClient();
builder.Services.AddSingleton((s) => {
return new CosmosClient(Environment.GetEnvironmentVariable("COSMOSDB_CONNECTIONSTRING"));
});
builder.Services.AddSingleton<ILoggerProvider, MyLoggerProvider>();
}
}
}
services.AddSingleton(context =>
{
var factory = context.GetRequiredService<ILoggerFactory>();
var loggingConfiguration = <get your app insights's instrumentation key from your configuration provider>;
var logger = new LoggerConfiguration()
.WriteTo
.ApplicationInsightsEvents(loggingConfiguration.ApplicationInsightsKey)
.CreateLogger();
return factory.AddSerilog(logger).CreateLogger("MyLogger");
});
需要在使用您的应用洞察进行摄取遥测之前配置记录器。设计用法(Serilog)模式可能不同,因为这只是一个存根来解释。
记录器作为函数参数传递:
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, Verbs.Get, Route = "v1/accounts/")] HttpRequest httpRequest, ILogger log)
{
// ...
}