Last active
November 17, 2016 09:41
-
-
Save codingoutloud/4099954 to your computer and use it in GitHub Desktop.
Enable Diagnostic Trace Logging for Windows Azure Compute Emulator from ASP.NET
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Code snippet for use in Windows Azure Cloud Services. | |
// The EnableDiagnosticTraceLoggingForComputeEmulator method can be called from ASP.NET | |
// code to enable output from the System.Diagnostics.Trace class to appear in the | |
// Windows Azure Compute Emulator. The method does nothing when deployed to the cloud, | |
// when run outside the compute emulator, when run other than in DEBUG, or run repeatedly. | |
// | |
// The code uses Reflection to dynamically load the needed assembly and create the | |
// specific TraceListener class needed. | |
// | |
// EXAMPLE INITIALIZING FROM Global.asax. | |
// protected void Application_Start() | |
// { | |
// // .. other config | |
// EnableDiagnosticTraceLoggingForComputeEmulator(); | |
// } | |
// | |
// EXAMPLE BENEFIT - ASP.NET MVC Controller | |
// public ActionResult Index() | |
// { | |
// Trace.TraceInformation("This message ONLY show up in the Windows Azure Compute Emulator" + | |
// " if EnableDiagnosticTraceLoggingForComputeEmulator() has been called!"); | |
// return View(); | |
// } | |
// | |
// Bill Wilder | @codingoutloud | Nov 2012 | |
// Original: https://gist.github.com/4099954 | |
using System.Reflection; | |
using System.Diagnostics; | |
[Conditional("DEBUG")] // doc on the Conditional attribute: http://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspx | |
void EnableDiagnosticTraceLoggingForComputeEmulator() | |
{ | |
try | |
{ | |
if (RoleEnvironment.IsAvailable && RoleEnvironment.IsEmulated) | |
{ | |
const string className = | |
"Microsoft.ServiceHosting.Tools.DevelopmentFabric.Runtime.DevelopmentFabricTraceListener"; | |
if (Trace.Listeners.Cast<TraceListener>().Any(tl => tl.GetType().FullName == className)) | |
{ | |
Trace.TraceWarning("Skipping attempt to add second instance of {0}.", className); | |
return; | |
} | |
const string assemblyName = | |
"Microsoft.ServiceHosting.Tools.DevelopmentFabric.Runtime, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; | |
//var path = Assembly.ReflectionOnlyLoad(assemblyName).Location; | |
//Assembly assembly = Assembly.LoadFile(path); | |
var assembly = Assembly.LoadFile(assemblyName); | |
var computeEmulatorTraceListenerType = assembly.GetType(className); | |
var computeEmulatorTraceListener = (TraceListener)Activator.CreateInstance(computeEmulatorTraceListenerType); | |
System.Diagnostics.Trace.Listeners.Add(computeEmulatorTraceListener); | |
Trace.TraceInformation("Diagnostic Trace statements will now appear in Compute Emulator: {0} added.", className); | |
} | |
} | |
catch (Exception) | |
{ | |
// eat any exceptions since this method offers a No-throw Guarantee | |
// http://en.wikipedia.org/wiki/Exception_guarantees | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for this very useful code snippet. Unfortunately it contains an error.
Assembly.LoadFile(assemblyName)
should be replaced byAssembly.Load(assemblyName)
.