【问题标题】:NUnit, Serilog and DatadogNUnit、Serilog 和 Datadog
【发布时间】:2020-12-30 16:52:27
【问题描述】:

我们在使用 NUnit、Serilog 和 Datadog 时遇到问题。

我们的配置

我们正在合作:

  • .NET Core 3.1 (Visual Studio 16.5.4)
  • NUnit + NUnit3TestAdapter
  • Serilog + Serilog.Sinks.Datadog.Logs

所有包都是 NuGet 最新的。

Serilog 配置

这是我们正在使用的 Serilog 配置:

DatadogConfiguration datadogConfiguration = new DatadogConfiguration()
{
  Url = "https://http-intake.logs.datadoghq.eu",
  Port = 443,
  UseSSL = true,
  UseTCP = false
};

ServiceProvider = new ServiceCollection()
  .AddSingleton<IMyService, MyService>()
  .AddLogging(configure => configure.AddSerilog(
    new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .Enrich.WithMachineName()
    .Enrich.WithProcessName()
    .Enrich.WithProcessId()
    .Enrich.WithThreadName()
    .Enrich.WithThreadId()
    .Enrich.WithProperty("Application", "Serilog Test Application")
    .Enrich.WithExceptionDetails()
    .WriteTo.Debug(
      outputTemplate: "[{Timestamp:o} {Level:u3}] [{MachineName}] [{ProcessName}:{ProcessId}] [{ThreadName}:{ThreadId}] [{Application}] [{SourceContext}] {Message:lj}{Exception}{Properties:j}{NewLine}")
    .WriteTo.File(
      path: "D:\\Temp\\LogFile.txt",
      outputTemplate: "[{Timestamp:o} {Level:u3}] [{MachineName}] [{ProcessName}:{ProcessId}] [{ThreadName}:{ThreadId}] [{Application}] [{SourceContext}] {Message:lj}{Exception}{Properties:j}{NewLine}")
    .WriteTo.DatadogLogs(
      "API_KEY",
      source: "csharp",
      service: "test service (by code)",
      host: "Serilog test application",
      tags: new string[] { "TAG_1:VALUE_1", "TAG_2:VALUE_2" },
      configuration: datadogConfiguration)
    .CreateLogger()))
  .BuildServiceProvider();

测试

我们正在调试运行(Visual Studio 中的 F5 键)和 NUnit 测试环境(Visual Studio 中)下测试此配置。

问题

我们面临的问题是,在调试运行时一切正常:

  • 日志正确到达 Visual Studio 调试输出。
  • 日志正确到达存档。
  • 日志正确到达 Datadog。

当我们在 NUnit 环境中运行这段代码时:

  • 日志正确到达 Visual Studio 调试输出。
  • 日志正确到达存档。

没有日志到达 Datadog

使用 Fiddler 检查网络流,我们注意到在调试运行时,日志会发送到 Datadog,而在 NUnit 环境下日志不会发送到 Datadog

有什么想法或建议吗?

谢谢

【问题讨论】:

  • 你找到解决方案了吗?
  • 我猜不是......

标签: .net-core nunit serilog datadog


【解决方案1】:

很抱歉这么晚才回复。

在与 Datadog 支持人员交换了一堆电子邮件后,发现解决方案很简单:

[OneTimeTearDown]
public virtual void Cleanup()
{
    logger.Dispose();
}

Dispose() 方法强制接收器优雅地关闭并发送存储在缓存中的日志。

请注意,日志不会立即出现在 Datadog 控制台中:请等待几秒钟(到几分钟),让他们的系统处理您发送的日志。

【讨论】:

    【解决方案2】:

    只需在 startup.cs 中添加即可。

    var config = new DatadogConfiguration("https://http-intake.logs.datadoghq.eu");
            Serilog.Log.Logger = new LoggerConfiguration()
           .WriteTo.DatadogLogs("<Datadog_API_KEY>", configuration: config)
           .CreateLogger();
    // Call this from anywhere in the app
    Serilog.Log.Logger.Information("This is a test from session-start");
    Serilog.Log.Logger.Error("This is a test from session-start");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      相关资源
      最近更新 更多