设置Azure跟踪日志记录开关-为什么在两个地方而不是一个地方

本文关键字:两个 一个 日志 跟踪 Azure 记录 开关 为什么 设置 | 更新日期: 2023-09-27 18:16:20

在试图弄清楚如何获取Azure Web/Worker角色的日志信息时,许多帖子建议我需要在-两个地方设置我的配置设置。

1配置.config文件

<system.diagnostics>
    <switches>
      <add name="logLevel" value="2" />
    </switches>
    <trace>
      <listeners>
        <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics">
          <filter type="" />
        </add>
      </listeners>
    </trace>
  </system.diagnostics>

2。编程(即。OnStart方法)

DiagnosticMonitorConfiguration config = DiagnosticMonitor.GetDefaultInitialConfiguration();
config.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
config.Logs.ScheduledTransferLogLevelFilter = LogLevel.Warning;
DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", config);

我不明白为什么每个人都建议我们必须定义日志过滤器级别两次?

配置文件还不够吗?

设置Azure跟踪日志记录开关-为什么在两个地方而不是一个地方

在第一个中,你告诉你的应用程序(网站等)你想使用哪种类型的跟踪侦听器。或者换句话说,当你写像Trace.WriteLine("Something")这样的东西时,谁应该听这个消息。

在第二处,您告诉VM中运行的诊断监视器引擎如何处理发送给它的跟踪数据。

例如,在你的代码(OnStart方法)中,你已经配置了:

config.Logs。

ScheduledTransferLogLevelFilter = LogLevel.Warning;

这意味着诊断监视器引擎将只接受日志级别为Warning或以上的跟踪消息,即只有这些消息才会被考虑传输到存储中。因此,即使您在代码中编写Trace.Information("Something"),也会被诊断监视器忽略。

您在代码中要做的另一件事是告诉诊断引擎如何处理它收集的诊断数据。你在这里配置的其他一些东西有:

  • 缓冲区配额-在缓冲区被滚动之前应该保留多少数据。
  • 传输到存储-将数据传输到Windows Azure存储的频率。

@Gaurav Mantri的回答可能正是你所需要的。
然而,

配置文件还不够吗?

我不太明白你所说的"足够"是什么意思。
Azure云服务已经为DiagnosticsMontiro预定义了默认值,因此您不必添加这些代码行。

实际上,由于Azure配置中的几乎所有内容都可以从应用程序外部进行控制,因此最好不要在代码中更改配置。

以下内容摘自MSDN:

Windows Azure SDK使您能够使用XML配置文件(Diagnostics .wadcfg)配置诊断,而不是在角色的OnStart方法中以编程方式配置诊断。
与编写代码相比,这种方法有几个优点:

  1. 在调用OnStart方法之前启动诊断,因此可以捕获和记录启动任务中的错误。
  2. 在运行时对配置所做的任何更改将在重新启动后保留。
  3. 诊断配置更改不需要重新构建代码。
  4. 您可以在特定配置中自动启动诊断监视器,而不需要额外的代码(这可能会导致阻止您的角色启动的异常)。