如何在 Azure Functions 中使用结构化日志记录
how to use structured logging in Azure Functions
我在 Azure 函数中使用相对较新的 ILogger(相对于 TraceWriter)选项,并试图了解如何捕获日志。
这是我的函数:
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, ILogger log)
{
log.LogTrace("Function 1 {level}", "trace");
log.LogWarning("Function 1 {level}", "warning");
log.LogError("Function 1 {level}", "error");
return req.CreateResponse(HttpStatusCode.OK, "Success!!!!");
}
当我查看服务器日志时,LogFiles 目录具有层次结构。
黄色突出显示的文件包括我的日志语句:
2017-08-19T13:58:31.814 Function started (Id=d40f2ca6-4cb6-4fbe-a05f-006ae3273562)
2017-08-19T13:58:33.045 Function 1 trace
2017-08-19T13:58:33.045 Function 1 warning
2017-08-19T13:58:33.045 Function 1 error
2017-08-19T13:58:33.075 Function completed (Success, Id=d40f2ca6-4cb6-4fbe-a05f-006ae3273562, Duration=1259ms)
结构化目录这里什么都没有,但在我的真实功能应用程序目录中似乎有各种"codeddiagnostic"日志语句。
我应该在这里期待什么?最终,我希望有一个接收器用于从我的所有应用程序组件进行日志记录,并全面利用结构化日志记录。
我也有同样的问题。日志文件记录器并不真正尊重结构化日志记录,但如果您使用 AppInsights for Azure Functions,它实际上会为您的结构化日志记录添加自定义属性
我在这里讨论过这件事
https://github.com/Azure/azure-webjobs-sdk-script/issues/1675
从 Azure Functions 收集结构化日志记录的最佳方式是使用 Application Insights。如果您定义了您的 Logger 基于 ILogger,您可以定义一个 Template 来指定您要记录的属性。然后在 Application Insights 跟踪上,使用 Application Insights 查询语言(又名 Kusto),您可以使用名称 customDimensions.prop__{name} 访问每个属性的值。
您可以在此 post https://platform.deloitte.com.au/articles/correlated-structured-logging-on-azure-functions
上找到有关如何使用 Azure Functions v2 执行此操作的示例
仅供参考:隔离模式(.NET5 和 .NET6)中的 Azure Functions 运行 不支持使用来自 DI 的 ILogger 或在 FunctionContext 中提供的结构化日志记录。截至 2021 年 11 月,有一个关于它的未解决的错误:https://github.com/Azure/azure-functions-dotnet-worker/issues/423
据我了解,该错误的发生是因为所有 ILogger 调用都通过主机和隔离函数之间的 GRPC 连接,并且在该过程中消息被格式化,而不是发送原始格式和参数。记录结构化日志的 Azure Insights 连接在主机上运行并且只接收最终消息。
我计划研究一些解决方法之王,尝试在隔离进程中直接访问 Azure Insights。如果它有效,我将 post 在上面链接的错误评论中的解决方法。
我在 Azure 函数中使用相对较新的 ILogger(相对于 TraceWriter)选项,并试图了解如何捕获日志。
这是我的函数:
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, ILogger log)
{
log.LogTrace("Function 1 {level}", "trace");
log.LogWarning("Function 1 {level}", "warning");
log.LogError("Function 1 {level}", "error");
return req.CreateResponse(HttpStatusCode.OK, "Success!!!!");
}
当我查看服务器日志时,LogFiles 目录具有层次结构。
黄色突出显示的文件包括我的日志语句:
2017-08-19T13:58:31.814 Function started (Id=d40f2ca6-4cb6-4fbe-a05f-006ae3273562)
2017-08-19T13:58:33.045 Function 1 trace
2017-08-19T13:58:33.045 Function 1 warning
2017-08-19T13:58:33.045 Function 1 error
2017-08-19T13:58:33.075 Function completed (Success, Id=d40f2ca6-4cb6-4fbe-a05f-006ae3273562, Duration=1259ms)
结构化目录这里什么都没有,但在我的真实功能应用程序目录中似乎有各种"codeddiagnostic"日志语句。
我应该在这里期待什么?最终,我希望有一个接收器用于从我的所有应用程序组件进行日志记录,并全面利用结构化日志记录。
我也有同样的问题。日志文件记录器并不真正尊重结构化日志记录,但如果您使用 AppInsights for Azure Functions,它实际上会为您的结构化日志记录添加自定义属性
我在这里讨论过这件事 https://github.com/Azure/azure-webjobs-sdk-script/issues/1675
从 Azure Functions 收集结构化日志记录的最佳方式是使用 Application Insights。如果您定义了您的 Logger 基于 ILogger,您可以定义一个 Template 来指定您要记录的属性。然后在 Application Insights 跟踪上,使用 Application Insights 查询语言(又名 Kusto),您可以使用名称 customDimensions.prop__{name} 访问每个属性的值。
您可以在此 post https://platform.deloitte.com.au/articles/correlated-structured-logging-on-azure-functions
上找到有关如何使用 Azure Functions v2 执行此操作的示例仅供参考:隔离模式(.NET5 和 .NET6)中的 Azure Functions 运行 不支持使用来自 DI 的 ILogger 或在 FunctionContext 中提供的结构化日志记录。截至 2021 年 11 月,有一个关于它的未解决的错误:https://github.com/Azure/azure-functions-dotnet-worker/issues/423
据我了解,该错误的发生是因为所有 ILogger 调用都通过主机和隔离函数之间的 GRPC 连接,并且在该过程中消息被格式化,而不是发送原始格式和参数。记录结构化日志的 Azure Insights 连接在主机上运行并且只接收最终消息。
我计划研究一些解决方法之王,尝试在隔离进程中直接访问 Azure Insights。如果它有效,我将 post 在上面链接的错误评论中的解决方法。