【问题标题】:How to setup Serilog with Azure Functions v4 correctly?如何使用 Azure Functions v4 正确设置 Serilog?
【发布时间】:2022-02-10 15:11:01
【问题描述】:

我想在 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.cs类中的配置:

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 的文章。在 Stackoverflow 上,我还阅读了几乎所有关于它的问题并尝试了所有答案。不幸的是,到目前为止还没有成功。

SO-问题例如: Use Serilog with Azure Log Stream
How do I use Serilog with Azure WebJobs?
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 的示例?

非常感谢您的帮助!
迈克尔·哈钦

【问题讨论】:

  • 也许我很笨,但是日志不是写了两次,因为这是你告诉它的吗? .WriteTo.DatadogLogs(...).WriteTo.Console()
  • 我在 .net 6 web api => WriteTo.Console(...).WriteTo.DatadogLogs(...) 中具有相同的配置,没有任何重复的错误日志。因此,如果 .net 6 web api 和 .net 6 Azure Functions 之间没有完全不同的东西,这不应该导致日志重复。我删除了WriteTo.Console(...) - 仍然重复的日志。

标签: c# azure-functions serilog .net-6.0 datadog


【解决方案1】:

知道了!将所有ILogger 替换为ILogger&lt;T&gt; 并删除builder.Services.AddSingleton&lt;ILoggerProvider&gt;(sp =&gt; new SerilogLoggerProvider(Log.Logger, true)); 行后,一切都按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 2020-03-11
    • 2022-11-10
    • 2018-07-11
    相关资源
    最近更新 更多