【发布时间】:2021-05-17 17:44:47
【问题描述】:
我正在尝试从我的 C# 应用程序中发布 Datadog 日志。我设法使用 Postman 发送具有所需结构的日志,但我无法弄清楚如何从代码中实现相同的目标。 我尝试了什么:
- 使用 DogStatsD - 但我不想安装代理,我更愿意使用 Datadog REST API 来发布我的日志。
- 使用 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 客户端,如果出现连接问题,我将处理它们。