【发布时间】:2021-03-25 08:25:39
【问题描述】:
我正在尝试让结构化日志记录在 Azure 函数中运行,但它在我这边不起作用。
我写了一个这样的简单应用程序
[FunctionName("Dummy")]
public IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous)]HttpRequest request, ILogger log)
{
var instance = new User
{
Name1 = "foo",
Name2 = "bar"
};
log.LogInformation("Test1: {$Test}", instance);
log.LogInformation("Test2: {@Name}", instance);
log.LogInformation("Test3: {@Name}", new { Name1 = "abc", Name2 = "def" });
log.LogInformation("Test4: {Vorname} {Nachname}", instance.Name1, instance.Name2);
return new OkResult();
}
public class User
{
public string Name1 { get; set; }
public string Name2 { get; set; }
}
输出如下所示:
Test1: Company.FunctionApp1.Function+User
Test2: Company.FunctionApp1.Function+User
Test3: { Name1 = abc, Name2 = def }
Test4: foo bar
我不知道为什么解构对动态类型起作用,但对定义的类不起作用。我发现了很多没有破坏对象结构的正常日志记录示例,但我认为它应该开箱即用。
我错过了什么吗?
【问题讨论】:
-
你想要什么结果?
-
我想要 Test2 和 Test3 之间相同的结果。就像在这个例子中一样 => github.com/messagetemplates/messagetemplates-csharp 我认为这将是 .Net Core Logger 的默认模板
-
此代码:
log.LogInformation("Test1: {$Test}", JsonConvert.SerializeObject(instance));是否满足您的要求? -
是的,这会起作用,但我认为这种行为是在默认记录器中实现的。
-
我不确定 Application Insights 提供商是否支持它。注意 - SeriLog 在记录时提供解构对象。目前,您可以使用的解决方法是在
User对象上定义 ToString。或者你可以编写一个扩展方法,使用反射来解构对象。
标签: logging azure-functions structured-logging