我们在Azure上运行的C#Web应用程序使用System.Diagnostics.Trace编写跟踪语句以进行调试/故障排除。一旦我们为这些日志启用blob存储(使用Azure门户中的"应用程序日志记录(blob)"选项),我们的应用程序的响应时间就会大大减慢。如果我关闭此选项,Web应用程序将再次加速(尽管显然我们不再在blob存储中获取日志)。
有人知道这是否是预期的?我们当然在每个请求上写了很多跟踪语句(每个请求大约100个),但我不认为这对于Web应用程序来说是不寻常的。有没有办法诊断为什么为日志启用blob存储会大大减慢这些跟踪语句的执行速度?是否将跟踪语句与blob存储中正在更新的日志同步?
答案 0 :(得分:2)
我无法找到有关如何在Azure中记录blob存储的信息。然而,这是我能够推断的:
我确认禁用global lock没有效果。因此,性能问题与锁争用没有直接关系。
我还确认,如果我关闭AutoFlush,则不会出现性能问题。
从进一步的交叉引用the source code for the .NET trace API,我得出的结论是,当您为日志启用blob存储时,它会向您的应用程序注入某种跟踪侦听器(就像您可以在Web中添加侦听器一样)。 config)并且它同步将它收到的每个trace语句写入blob存储。
因此,似乎有几种方法可以解决此问题:
我最终做了#3,因为事实证明,我们已经配置了Application Insights,我们只是没有意识到它可以处理跟踪日志记录和查询。在追踪事件disabling sampling之后,我们现在可以轻松地远程查询任何日志语句,并获得符合任何条件的完整跟踪集(关键字匹配,特定请求的所有跟踪,特定的所有跟踪)此外,使用Application Insights跟踪侦听器编写日志语句没有明显的同步开销,因此我们的应用程序中的任何内容都不得更改(我们可以继续使用.NET跟踪类)。作为奖励,由于Application Insights跟踪对跟踪源非常灵活,我们甚至可以根据需要切换到另一个更高性能的日志记录API(例如ETW或log4net),Application Insights仍然有效。
最终,您应该考虑使用Application Insights来存储和查询跟踪。根据您最初想要blob存储日志的原因,它可能会或可能不会满足您的需求,但它对我们有用。