【问题标题】:Datadog logs with C# and .NET使用 C# 和 .NET 的 Datadog 日志
【发布时间】:2021-05-17 17:44:47
【问题描述】:

我正在尝试从我的 C# 应用程序中发布 Datadog 日志。我设法使用 Postman 发送具有所需结构的日志,但我无法弄清楚如何从代码中实现相同的目标。 我尝试了什么:

  1. 使用 DogStatsD - 但我不想安装代理,我更愿意使用 Datadog REST API 来发布我的日志。
  2. 使用 Serilog.Sinks.Datadog.Logs - 这似乎很容易使用,但我不知道它是如何工作的,以及是否可以更改日志结构。默认情况下,生成的 json 中有 MessageTemplate 和 Properties 字段。我希望能够在一条消息中发送我自己的结构,而不是使用 MessageTemplate。这可能吗?

The desired log to be seen in Datadog UI Logs Section:

{
    hostname: myHost
    myStuff {   
    item1: item_val1
    item2: item_val2
    }
    otherStuff: oh wow this is cool
    service: MyService
}

Here's what I sent using Postman to achieve this result:

网址:https://http-intake.logs.datadoghq.com/v1/input

标题:

DD-API-KEY: my_api_key
Content-Type: application/json

正文:

{
    "ddsource": "mySource",
    "ddtags": "myTag: myVal, myValWithoutTag",
    "hostname": "myHost",
    "message": {
        "myStuff":
        {
            "item1": "item_val1",
            "item2": "item_val2"
        },
        "otherStuff": "oh wow this is cool"
    },
    "service": "MyService"
}

是否可以使用 datalog serilog sinks 获得相同(甚至相似)的结果?如果没有,我怎样才能在 C# 中实现这个结果?

这是我从代码中尝试的:

var config = new DatadogConfiguration(url: "intake.logs.datadoghq.com", port: 443, useSSL: true, useTCP: true);
using (var log = new LoggerConfiguration().WriteTo.DatadogLogs(
        "<myApiKey>",
        source: "mySource",
        service: "myService",
        host: "myHost",
        tags: new string[] {"myTag:myVal", "myValWithoutTag"},
        configuration: config
    ).
    CreateLogger())
{
    var messageTemplate = "{message}";
    var message = new
    {
        myStuff = new
        {
            item1 = "item_val1",
            item2 = "item_val2"
        }
    };

    log.Information(messageTemplate, message);
}

Datadog UI 日志部分出现不希望的结果:

{
    host: myHost
    level: Information
    MessageTemplate: {message}
    Properties: {   
    message: { myStuff = { item1 = item_val1, item2 = item_val2 } }
    }
    service: myService
    Timestamp: 2021-05-17T00:13:14.2614896+03:00
}

标签部分确实有效,主机和服务部分也是一样的。我不介意级别和时间戳添加, 但我很想将正文更改为 Postman 示例中的行为(只是消息作为 JSON)。 所以我的问题是:

  • 是否可以使用 Datadog Serilog 接收器控制消息正文格式?
  • 有没有我没有尝试过的好选择? (除了写我自己的客户,这是我倾向于的)
  • 谁能向我解释它是如何工作的?我无法弄清楚水槽的概念。谁能解释它是如何工作的?为什么这个任务没有实际的 REST HTTP 客户端?

谢谢!

【问题讨论】:

  • 嗨。查看您的数据狗摄取管道。 (在日志 > 配置 > 管道下)。使用的管道是通过匹配“源”来确定的,例如“csharp”。您可以克隆默认的 C# 管道,然后禁用默认并使用您自己的。我不确定标签发生了什么,但查看此管道可能会帮助您了解您的消息/消息模板发生了什么,重要的是要知道在获得您在 UI 上看到的内容之前有一个非常重要的步骤。
  • 谢谢!实际上,我只有默认的 Nginx PIPELINE,C# 没有。在阅读了有关日志接收器的更多信息后,我找不到改变 Serilog 提供的 MessageTemplate 行为的方法,这似乎是一种设计选择。我最终编写了自己的 HTTP 客户端,如果出现连接问题,我将处理它们。

标签: c# .net datadog


【解决方案1】:

您真的不需要使用代理来向 Datadog 发送和自定义日志。提供跟踪和其他指标非常酷。不幸的是,无法在 Datadog 日志记录配置中更改 MessageTemplate。只在 Serilog 中放入 MessageTemplate 之类的消息:

var message = "Service started";
logger.Information(message);

您可以通过 2 种方式添加属性。 使用 Serilog 丰富:

var config = new DatadogConfiguration(url: "intake.logs.datadoghq.com", port: 443, useSSL: true, useTCP: true);
using (var log = new LoggerConfiguration()
    .Enrich.WithProperty(item1, item_val1)
    .WriteTo.DatadogLogs(
      "<myApiKey>",
      source: "mySource",
      service: "myService",
      host: "myHost",
      tags: new string[] {"myTag:myVal", "myValWithoutTag"},
      configuration: config
).
CreateLogger())

或者通过中间件推送LogContext中的属性:

using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Serilog.Context;

namespace MyProject.Middlewares
{
  public class LogPropertyMiddleware
  {
    private readonly RequestDelegate _next;

    public LogUserInfoMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        LogContext.PushProperty("item1", "item_val1");

        await _next.Invoke(context);
    }
  }
}

为启动添加中间件:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
   .....
   .....
   app.UseMiddleware<LogPropertyMiddleware>();
   .....
}

【讨论】:

    猜你喜欢
    • 2022-06-13
    • 2020-02-04
    • 2020-05-26
    • 2023-04-07
    • 1970-01-01
    • 2022-11-24
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多