Application Insights 在发布时不会从 Azure Functions 捕获日志
Application Insights does not capture logs from Azure Function when published
我有以下 Azure 函数:
using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
using System.Threading.Tasks;
internal class ExpServiceFuncApp
{
[FunctionName("ExpServiceFuncApp")]
public static void Run([TimerTrigger("0 */10 * * * *")] TimerInfo myTimer, ILogger log)
{
//using var channel = new InMemoryChannel();
try
{
IServiceCollection services = new ServiceCollection();
//services.Configure<TelemetryConfiguration>(config => config.TelemetryChannel = channel);
//services.AddLogging(builder =>
//{
// builder.AddApplicationInsights(KeyVaultConfig.GetSecretValue("InstrumentationKey"));
//})
services.AddSingleton<IDataRec, DataRec.DataRec>()
.AddSingleton<IDataProc, DataProc.DataProc>()
.AddSingleton<IDClient, KustoDClient>()
.AddSingleton<IAzureBlobClient, AzureBlobClient>()
.AddSingleton<IAzureKustoClient, AzureKustoClient>()
.AddSingleton<IQueriesSettings, QueriesSettings>()
.AddSingleton<IServiceSettings, ServiceSettings>()
.AddTransient<IRawData, RawData>();
IServiceProvider serviceProvider = services.BuildServiceProvider();
var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
ILogger logger = loggerFactory.CreateLogger<ExportServiceFunctionApp>();
logger?.LogInformation("Initiate.");
var dataProc = serviceProvider.GetRequiredService<IDataProc>();
logger?.LogInformation("Start Data Process.");
dataProc.Start();
Console.ReadLine();
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
}
catch (Exception ex)
{
}
//finally
//{
// channel.Flush();
// Task.Delay(5000).Wait();
//}
}
}
正如你在这里看到的,我在这个 class 中有一些日志信息,我还有其他日志正在被注入到其他 classes 中。此外,我将机密存储在 Azure Key Vault 中。这里的问题是,当我将应用程序发布到 azure 时,application insights 没有跟踪任何这些日志 (代码中提到的 log.Information 或 log.Debug).正如您还看到的,我评论了一些行,我认为这些行可能有助于跟踪 ApplicationInsights 上的日志,但仍然没有成功。我在 Application Insights 上收到的内容如下:
enter image description here
host.json如下:
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
},
"logLevel": {
"Default": "Information",
"Microsoft": "Error"
}
}
}
}
我真的不知道代码中是否缺少或错误。老实说,我不知道触发器是否只是 运行ning 本身,而不是每 10 分钟内执行一次代码。我真的尝试了几种方法来跟踪这些日志,但仍然不起作用。任何人都可以为我提供解决这个问题的方法吗? 请注意,当我 运行 程序作为控制台应用程序并在控制台上显示结果时,一切正常。 所以我现在从上面的代码中猜测问题是如何将应用程序洞察力与 Azure 函数集成。
感谢@Peter Bons 的评论。
使用以下代码段修改您的配置
{
"ApplicationInsights": {
"InstrumentationKey": "my-instrumentation-key",
"EnableAdaptiveSampling": false,
"EnablePerformanceCounterCollectionModule": false
},
"Logging": {
"LogLevel": {
"Default": "Warning"
},
"ApplicationInsights": {
"LogLevel": {
"Default": "Information"
}
}
}
}
- 使用 appsettings.json
在配置中创建过滤规则
- 在代码中创建过滤规则
详情请参考Application Insights logging with Console application ,Integrate Application Insights Into Azure Functions and
我有以下 Azure 函数:
using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
using System.Threading.Tasks;
internal class ExpServiceFuncApp
{
[FunctionName("ExpServiceFuncApp")]
public static void Run([TimerTrigger("0 */10 * * * *")] TimerInfo myTimer, ILogger log)
{
//using var channel = new InMemoryChannel();
try
{
IServiceCollection services = new ServiceCollection();
//services.Configure<TelemetryConfiguration>(config => config.TelemetryChannel = channel);
//services.AddLogging(builder =>
//{
// builder.AddApplicationInsights(KeyVaultConfig.GetSecretValue("InstrumentationKey"));
//})
services.AddSingleton<IDataRec, DataRec.DataRec>()
.AddSingleton<IDataProc, DataProc.DataProc>()
.AddSingleton<IDClient, KustoDClient>()
.AddSingleton<IAzureBlobClient, AzureBlobClient>()
.AddSingleton<IAzureKustoClient, AzureKustoClient>()
.AddSingleton<IQueriesSettings, QueriesSettings>()
.AddSingleton<IServiceSettings, ServiceSettings>()
.AddTransient<IRawData, RawData>();
IServiceProvider serviceProvider = services.BuildServiceProvider();
var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
ILogger logger = loggerFactory.CreateLogger<ExportServiceFunctionApp>();
logger?.LogInformation("Initiate.");
var dataProc = serviceProvider.GetRequiredService<IDataProc>();
logger?.LogInformation("Start Data Process.");
dataProc.Start();
Console.ReadLine();
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
}
catch (Exception ex)
{
}
//finally
//{
// channel.Flush();
// Task.Delay(5000).Wait();
//}
}
}
正如你在这里看到的,我在这个 class 中有一些日志信息,我还有其他日志正在被注入到其他 classes 中。此外,我将机密存储在 Azure Key Vault 中。这里的问题是,当我将应用程序发布到 azure 时,application insights 没有跟踪任何这些日志 (代码中提到的 log.Information 或 log.Debug).正如您还看到的,我评论了一些行,我认为这些行可能有助于跟踪 ApplicationInsights 上的日志,但仍然没有成功。我在 Application Insights 上收到的内容如下:
enter image description here
host.json如下:
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
},
"logLevel": {
"Default": "Information",
"Microsoft": "Error"
}
}
}
}
我真的不知道代码中是否缺少或错误。老实说,我不知道触发器是否只是 运行ning 本身,而不是每 10 分钟内执行一次代码。我真的尝试了几种方法来跟踪这些日志,但仍然不起作用。任何人都可以为我提供解决这个问题的方法吗? 请注意,当我 运行 程序作为控制台应用程序并在控制台上显示结果时,一切正常。 所以我现在从上面的代码中猜测问题是如何将应用程序洞察力与 Azure 函数集成。
感谢@Peter Bons 的评论。
使用以下代码段修改您的配置
{
"ApplicationInsights": {
"InstrumentationKey": "my-instrumentation-key",
"EnableAdaptiveSampling": false,
"EnablePerformanceCounterCollectionModule": false
},
"Logging": {
"LogLevel": {
"Default": "Warning"
},
"ApplicationInsights": {
"LogLevel": {
"Default": "Information"
}
}
}
}
- 使用 appsettings.json 在配置中创建过滤规则
- 在代码中创建过滤规则
详情请参考Application Insights logging with Console application ,Integrate Application Insights Into Azure Functions and