是否有替代AzureDriveTraceListener以使TraceSource事件出现在Azure网站流式传输日志中?

问题描述:

我已经使用自定义TraceSources跟踪开关检测了我的Azure应用服务Web应用程序(.Net 4.6.1),以便在运行时可以精确控制跟踪卷。发布到我的Azure网站后,没有任何跟踪语句出现在Azure输出的流式日志中。当我在代码中放入Trace.WriteLine声明时,我看到它们出现。是否有替代AzureDriveTraceListener以使TraceSource事件出现在Azure网站流式传输日志中?

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语句?

是否有替代AzureDriveTraceListener让TraceSource事件出现在Azure网站流式传输日志中?

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

1,创建一个Asp.net项目

2.Reference的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.Visit的页面,并从Azure的门户检查

enter image description here

+0

谢谢汤姆孙我知道它是有效的,但是微软没有任何AzureDriveTraceListener的官方文档,所以我不知道是否可以安全地使用该未公开的功能。它也不适用于本地调试,因此它只是一个在发布转换中添加此选项的选项。这个问题已经以某种形式被问及5年了,并且预计会看到来自MS的官方说明如何实现这一点。 – Josh

+0

另外,链接到的NuGet包在Microsoft命名空间中,但它不是Microsoft发行版。我个人从未从Nuget下载任何声称为Microsoft软件包但未由官方Microsof源发布的任何内容 – Josh

+0

从[nuget许可链接](https://raw.githubusercontent.com/Microsoft/dotnet/master/LICENSE) ,我们可以知道sdk的版权是微软的,所以你可以很容易使用。 –