如何使用 Azure Functions v4 正确设置 Serilog?
How to setup Serilog with Azure Functions v4 correctly?
我想在 Azure Function v4 (.net 6) 中使用 Serilog(日志应该发送到 Datadog)。为此,我安装了以下 nuget 包:
<PackageReference Include="Serilog" Version="2.10.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="3.1.0" />
<PackageReference Include="Serilog.Formatting.Compact" Version="1.1.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.0.1" />
<PackageReference Include="Serilog.Sinks.Datadog.Logs" Version="0.3.5" />
下面是Startup.csclass中的配置:
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddHttpClient();
//... adding services etc.
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.MinimumLevel.Override("Worker", LogEventLevel.Warning)
.MinimumLevel.Override("Host", LogEventLevel.Warning)
.MinimumLevel.Override("System", LogEventLevel.Error)
.MinimumLevel.Override("Function", LogEventLevel.Error)
.MinimumLevel.Override("Azure.Storage.Blobs", LogEventLevel.Error)
.MinimumLevel.Override("Azure.Core", LogEventLevel.Error)
.Enrich.WithProperty("Application", "Comatic.KrediScan.AzureFunctions")
.Enrich.FromLogContext()
.WriteTo.DatadogLogs("XXXXXXXXXXX", configuration: new DatadogConfiguration() { Url = "https://http-intake.logs.datadoghq.eu" }, logLevel: LogEventLevel.Debug)
.WriteTo.Console()
.CreateLogger();
builder.Services.AddSingleton<ILoggerProvider>(sp => new SerilogLoggerProvider(Log.Logger, true));
builder.Services.AddLogging(lb =>
{
//lb.ClearProviders(); //--> if used nothing works...
lb.AddSerilog(Log.Logger, true);
});
基本上日志记录有效,但所有日志语句都被写入两次(有几毫秒的差异,Datadog 和控制台)。
显然,我在配置方面做了一些根本性的错误。我不使用 appsettings.json,Serilog 的配置完全在代码中进行。我搜索了整个互联网并阅读了几乎所有关于 Serilog 和 Azure Functions 的文章。在 Whosebug 上,我几乎还阅读了所有关于它的问题并尝试了所有答案。很遗憾,至今没有成功。
SO-问题举例:
Serilog enricher Dependency Injection with Azure Functions
https://github.com/hgmauri/sample-azure-functions/blob/main/src/Sample.AzureFunctions.DotNet31/Startup.cs
是否有使用 Azure Functions v4 / .net 6 设置 Serilog 的示例?
非常感谢您的帮助!
迈克尔·哈琛
知道了!将所有 ILogger
替换为 ILogger<T>
并删除行 builder.Services.AddSingleton<ILoggerProvider>(sp => new SerilogLoggerProvider(Log.Logger, true));
后,一切都按预期工作。
我想在 Azure Function v4 (.net 6) 中使用 Serilog(日志应该发送到 Datadog)。为此,我安装了以下 nuget 包:
<PackageReference Include="Serilog" Version="2.10.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="3.1.0" />
<PackageReference Include="Serilog.Formatting.Compact" Version="1.1.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.0.1" />
<PackageReference Include="Serilog.Sinks.Datadog.Logs" Version="0.3.5" />
下面是Startup.csclass中的配置:
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddHttpClient();
//... adding services etc.
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.MinimumLevel.Override("Worker", LogEventLevel.Warning)
.MinimumLevel.Override("Host", LogEventLevel.Warning)
.MinimumLevel.Override("System", LogEventLevel.Error)
.MinimumLevel.Override("Function", LogEventLevel.Error)
.MinimumLevel.Override("Azure.Storage.Blobs", LogEventLevel.Error)
.MinimumLevel.Override("Azure.Core", LogEventLevel.Error)
.Enrich.WithProperty("Application", "Comatic.KrediScan.AzureFunctions")
.Enrich.FromLogContext()
.WriteTo.DatadogLogs("XXXXXXXXXXX", configuration: new DatadogConfiguration() { Url = "https://http-intake.logs.datadoghq.eu" }, logLevel: LogEventLevel.Debug)
.WriteTo.Console()
.CreateLogger();
builder.Services.AddSingleton<ILoggerProvider>(sp => new SerilogLoggerProvider(Log.Logger, true));
builder.Services.AddLogging(lb =>
{
//lb.ClearProviders(); //--> if used nothing works...
lb.AddSerilog(Log.Logger, true);
});
基本上日志记录有效,但所有日志语句都被写入两次(有几毫秒的差异,Datadog 和控制台)。
显然,我在配置方面做了一些根本性的错误。我不使用 appsettings.json,Serilog 的配置完全在代码中进行。我搜索了整个互联网并阅读了几乎所有关于 Serilog 和 Azure Functions 的文章。在 Whosebug 上,我几乎还阅读了所有关于它的问题并尝试了所有答案。很遗憾,至今没有成功。
SO-问题举例:
Serilog enricher Dependency Injection with Azure Functions
https://github.com/hgmauri/sample-azure-functions/blob/main/src/Sample.AzureFunctions.DotNet31/Startup.cs
是否有使用 Azure Functions v4 / .net 6 设置 Serilog 的示例?
非常感谢您的帮助!
迈克尔·哈琛
知道了!将所有 ILogger
替换为 ILogger<T>
并删除行 builder.Services.AddSingleton<ILoggerProvider>(sp => new SerilogLoggerProvider(Log.Logger, true));
后,一切都按预期工作。