azure - 是否有 AzureDriveTraceListener 的替代方法可以让 TraceSource 事件出现在 Azure 网站流日志中?

标签 azure azure-web-app-service trace system.diagnostics azure-diagnostics

我使用带有跟踪开关的自定义 TraceSources 来检测我的 Azure 应用服务 Web 应用程序 (.Net 4.6.1),以便我可以在运行时对跟踪量进行精细控制。发布到我的 Azure 网站后,从 Azure 输出的流日志中没有出现任何跟踪语句。当我将 Trace.WriteLine 语句放入代码中时,我看到它们出现。

Trace.WriteLine("Great Success");
TraceSources.Session.Warn("Ultimate Failure");

有一个handful of articles在 2012-2014 年的网络上,它表明向我的自定义源添加 AzureDriveTraceListener 监听器将导致我的数据出现在流日志中,但 AzureDriveTraceListener 不会似乎得到了 Microsoft 的官方支持,并且它所在的 Microsoft.WindowsAzure.WebSites.Diagnostics 程序集无法从 Azure SDK(当前为 2.9)或 NuGet 中获得(尽管有人已经在那个名字)。 This guy asked a similar SO question years ago ,但这是关于模拟器的。

是否有官方或批准的方式在 Azure 诊断日志中显示 TraceSource.TraceEventTraceinformation 语句?

最佳答案

Is there an alternative to AzureDriveTraceListener to get TraceSource events to appear in Azure web site streaming logs?

是的,我们可以使用 AzureDriveTraceListener 来做到这一点。我为它做了一个测试演示。 以下是我的详细步骤:

1.创建Asp.net项目

2.引用Microsoft.WindowsAzure.WebSites.Diagnostics SDK。

3.在web.config文件中添加以下配置

<system.diagnostics>
      <sharedListeners>
        <add name="AzureDriveTraceListener" type="Microsoft.WindowsAzure.WebSites.Diagnostics.AzureDriveTraceListener, Microsoft.WindowsAzure.WebSites.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </sharedListeners>
      <sources>
        <source name="TraceSourceLogging" switchName="TestSwitch" switchType="System.Diagnostics.SourceSwitch">
          <listeners>
            <add name="AzureDriveTraceListener"/>
          </listeners>
        </source>
      </sources>
      <switches>
        <add name="TestSwitch" value="Verbose" />
      </switches>
    </system.diagnostics>

4.在工程中添加AppTrace类,我们可以从 blog 获取演示代码

 public static class AppTrace
    {
        public static TraceSource TraceSource { get; set; }

        static AppTrace()
        {
            TraceSource = new TraceSource("TraceSourceLogging")
            {
                Switch = {Level = (SourceLevels) Enum.Parse(typeof(SourceLevels), "All", true)}
            };
        }

        private static string Format(string message, string memberName, string filePath, int lineNumber)
        {
            return $"Message: {message}, MemberName: {memberName}, FilePath: {filePath}, LineNumber: {lineNumber}";
        }
        public static void Verbose(string message, int id = 16, [CallerMemberName] string memberName = "",
            [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0)
        {
            TraceSource.TraceEvent(TraceEventType.Verbose, id, Format(message, memberName, filePath, lineNumber));
        }

        public static void Error(string message, int id = 2, [CallerMemberName] string memberName = "",
            [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0)
        {
            TraceSource.TraceEvent(TraceEventType.Error, id, Format(message, memberName, filePath, lineNumber));
        }

        public static void Information(string message, int id = 8, [CallerMemberName] string memberName = "",
            [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0)
        {

            TraceSource.TraceEvent(TraceEventType.Information, id, Format(message, memberName, filePath, lineNumber));
        }
        public static void Critical(string message, int id = 1, [CallerMemberName]string memberName =
            "", [CallerFilePath] string filePath = "", [CallerLineNumber]int lineNumber = 0)
        {
            TraceSource.TraceEvent(TraceEventType.Critical, id, Format(message, memberName, filePath, lineNumber));
        }

        public static void Warning(string message, int id = 4, [CallerMemberName]string memberName =
            "", [CallerFilePath] string filePath = "", [CallerLineNumber]int lineNumber = 0)
        {
            TraceSource.TraceEvent(TraceEventType.Warning, id, Format(message, memberName, filePath, lineNumber));
        }

        public static void Start(string service, int id = 256, [CallerMemberName]string memberName =
            "", [CallerFilePath] string filePath = "", [CallerLineNumber]int lineNumber = 0)
        {
            TraceSource.TraceEvent(TraceEventType.Start, id, Format("Starting - " + service, memberName, filePath, lineNumber));
        }

        public static void Stop(string service, int id = 512, [CallerMemberName]string memberName =
            "", [CallerFilePath] string filePath = "", [CallerLineNumber]int lineNumber = 0)
        {
            TraceSource.TraceEvent(TraceEventType.Stop, id, Format("Stoping - " + service, memberName, filePath, lineNumber));
        }
    } 

5.添加测试页面。

protected void Page_Load(object sender, EventArgs e)
    {

        AppTrace.Verbose("Test Verbose");
        AppTrace.Error("Test Error");
        AppTrace.Warning("Test Warning");
        AppTrace.Information("Test Information");
        AppTrace.Critical("Test Critical");

        Label1.Text = "Completed";

    }

6.将项目发布到Azure。

7.访问该页面并从Azure门户检查

enter image description here

关于azure - 是否有 AzureDriveTraceListener 的替代方法可以让 TraceSource 事件出现在 Azure 网站流日志中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45181357/

相关文章:

azure - Snowpipe 云消息传递机制在 Azure 上到底如何工作?

azure - 无法从 Azure Web App 获取 .json 文件

azure - AzCopy - 在带有 $(美元符号)的位置中断

c# - 如何跟踪调用的每个方法

c - 跟踪 Mhash 文件(散列)

Azure表存储: Capture all table activity for compliance purposes

sockets - Azure 负载均衡器在超时后保持服务器端的套接字打开

c# - 如何访问直接放在kudu home/site/wwwroot中的html页面?

ruby-on-rails - Rails 2.3 中的详细语句跟踪

python - Azure ML Studio 作业资源