我有一个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上的Function门户,以查看是否实际打印了日志:
我只看到表明该功能成功运行的日志,但是看不到我的日志。
问题
为什么在我的Azure Function v2中注入的ILogger
缺少APPINSIGHTS_INSTRUMENTATIONKEY
?
更新
当我查看注入的ILogger
时,可以看到未设置Application Insights Provider的InstrumentationKey。对于ctor注入的ILogger,也是如此,对于Run方法中注入的ILogger
也是如此。
对于我的本地测试,在local.settings.json
文件中声明了检测密钥:
答案 0 :(得分:1)
我对不同的设置变量感到困惑(ILogger
与ILoggerFactory
以及其他内容)。
在我的Startup
类中,调用AddLogging
是正确的(无论是否具有最低级别,只要它在此处或在host.json
文件中定义)即可。< / p>
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:无法执行 解决类型为“ Microsoft.Extensions.Logging.ILogger”的服务,同时 尝试激活“ XXX”
但是,如果我指定了ILoggerFactory
,它确实可以工作。空的检测键属性没有任何影响。
我已经更新了host.json
文件,以包括具有最低严重性级别的日志记录信息以及Application Insights的配置信息:
{
"version": "2.0",
"logging": {
"fileLoggingMode": "debugOnly",
"logLevel": {
"default": "Trace"
},
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"maxTelemetryItemsPerSecond" : 5
}
}
}
}
更新
如评论中所述,Microsoft发布了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>();
}
}
}
答案 1 :(得分:0)
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");
});
需要先通过应用程序见识配置Logger,然后才能进行遥测。设计用法(Serilog)模式可能有所不同,因为这只是一个说明。
答案 2 :(得分:-1)
记录器作为函数参数传递:
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, Verbs.Get, Route = "v1/accounts/")] HttpRequest httpRequest, ILogger log)
{
// ...
}