我在 .NET 6.x 上有一个遗留的进程内 azure 函数应用程序,我正在将其转换为在稍后迁移到 .NET 8 之前使用隔离的运行时。转换是按照迁移 .NET 中概述的步骤完成的应用程序从进程内模型到独立工作模型,但存在一些特定于应用程序的细微偏差。我们的应用程序设置为使用 Serilog 登录到 azure。这是Program.cs文件的相关部分
var host = new HostBuilder()
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
}).ConfigureLogging(logBuilder => {
//we add dispose: false for reasons I won't get into here
logBuilder.AddSerilog(dispose: false);
})
.Build();
这是
appsettings.json
中的 serilog 配置
"Serilog": {
"Using": [
"Serilog.Sinks.AzureAnalytics",
"Serilog.Sinks.Console"
],
"MinimumLevel": "Information",
"WriteTo": [
{
"Name": "AzureAnalytics",
"Args": {
"logName": "<Redacted>",
"workspaceId": "<Redacted>",
"authenticationId": "<Redacted>"
}
},
{
"Name": "Console",
"Args": {
"logName": "<Redacted>"
}
}
],
"Enrich": [
"AppName"
],
"Properties": {
"AppName": "<Redacted>"
}
},
出于代码共享原因,日志配置在其他地方实例化,但它相当于
var loggingConfiguration = new LoggerConfiguration()
.MinimumLevel.Debug()
.ReadFrom.Configuration(configuration);
这两个文件几乎都是开箱即用的。将应用程序部署到 azure 后,我们观察到一堆新的日志噪音进入了我们的 Azure 日志
我们希望过滤掉这些噪音,以保持我们的日志有意义。看起来我们想要过滤掉的所有事件都来自两个来源,基于日志中开箱即用的
SourceContext
列
我发现这个类似的问题并尝试将以下内容添加到我们的host.json文件中,但这并没有删除日志。
{
"version": "2.0",
"logging": {
"IncludeScopes": false,
"LogLevel": { //added this block
"Default": "Information",
"System": "None",
"Microsoft": "None"
},
"applicationInsights": {
"enableDependencyTracking": true,
"dependencyTrackingOptions": {
"enableSqlCommandTextInstrumentation": true
},
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
}
},
"functionTimeout": "05:00:00"
}
我认为我们只是没有将正确的条目添加到
LogLevel
块中,但我发现的其他微软文档并不能帮助我准确识别它应该是什么。
第一个链接的底部附近有一个部分,用于禁用除用户启动的日志之外的所有内容,但是必须对每个单独的 HTTP 触发函数执行此操作,这对于我们的目的来说根本无法维护。
上面的第二个链接调用了
Host.Results
和Functions
,但有一个警告块,指出调整这两个设置可能会删除我们确实想要保留的遥测数据
所以我的具体问题是如何从我们的天蓝色日志中消除额外的日志噪声?
出于代码共享原因,日志配置在其他地方实例化,但它相当于:
var loggingConfiguration = new LoggerConfiguration() .MinimumLevel.Debug() .ReadFrom.Configuration(configuration); ```
我认为这会向您的函数添加日志噪声,因为它已设置为调试的最低级别。
在Azure Function中,默认级别是信息级别,在文件
host.json
中定义。
我在这里使用 HTTP 触发器。
Function1.cs
:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Routing;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
namespace FunctionApp3
{
public class Function1
{
private readonly ILogger<Function1> _logger;
public Function1(ILogger<Function1> logger)
{
_logger = logger;
}
[Function("Function1")]
public IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req)
{
_logger.LogInformation("C# HTTP trigger function processed a request.");
return new OkObjectResult($"Welcome to Azure Functions!");
}
}
}
FunctionApp3.csproj
:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<OutputType>Exe</OutputType>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.20.1" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.1.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version="1.2.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.16.4" />
<PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.21.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.1.0" />
<PackageReference Include="Serilog" Version="3.1.1" />
<PackageReference Include="Serilog.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="5.0.1" />
</ItemGroup>
<ItemGroup>
<None Update="host.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="local.settings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext" />
</ItemGroup>
</Project>
host.json
:
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
},
"enableLiveMetricsFilters": true
}
}
}
OUTPUT
:在过滤日志之前
Serilog
:
Program.cs
:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Serilog;
using Serilog.Events;
var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
services.AddLogging(logbuilder =>
{
logbuilder.AddSerilog(new LoggerConfiguration()
.WriteTo.Console()
.CreateLogger()); ;
});
})
.Build();
host.Run();
我还获得了
information
级噪音日志。
当地:
过滤日志后
Serilog
:
我们希望过滤掉这些噪音,以保持我们的日志有意义。它 看起来我们想要过滤掉的所有事件都来自两个 基于开箱即用的
列的来源 日志SourceContext
- Microsoft.AspNetCore.Hosting.Diagnostics
- Microsoft.AspNetCore.Routing.EndpointMiddleware
我已经过滤了这两个来源
Program.cs
:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Serilog;
using Serilog.Events;
var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
services.AddLogging(logbuilder =>
{
logbuilder.AddSerilog(new LoggerConfiguration()
.MinimumLevel.Override("Microsoft.AspNetCore.Hosting.Diagnostics", LogEventLevel.Warning)
.MinimumLevel.Override("Microsoft.AspNetCore.Routing.EndpointMiddleware", LogEventLevel.Warning)
.WriteTo.Console()
.CreateLogger()); ;
});
})
.Build();
host.Run();
本地:
天蓝色: