2016-01-19 7 views
21

Ich habe eine ASP.NET 5-Web-API, die ich in Azure als Web-App hosten. Ich möchte mithilfe von Azure Diagnostics Nachrichten aus meinem Code protokollieren. Es gibt mehrere Artikel einschließlich Azure docs, die vorschlagen, dass es so einfach wie System.Diagnostics.Trace.WriteLine einmal aktiviert sein sollte. Die Protokolle sollten unter LogsFiles/Application und im Protokolldatenstrom in Azure angezeigt werden.Protokollieren von ASP.NET 5-Anwendung gehostet als Azure Web App

ich fähige Anwendung für die Web-App Anmeldung:

enter image description here

Aber die folgenden Anrufe produziert keine Protokolle:

System.Diagnostics.Trace.TraceError("TEST"); 
System.Diagnostics.Trace.TraceInformation("TEST"); 
System.Diagnostics.Trace.TraceWarning("TEST"); 
System.Diagnostics.Trace.WriteLine("TEST"); 

Ich habe versucht, manuell TRACE Symbol, aber ohne Glück zu definieren:

Ich habe auch versucht die neue Microsoft.Extensions.Logging Framework zu verwenden und wieder ILogger.Log API, aber ohne Ergebnis zu erzielen:

public void Configure(IApplicationBuilder app, 
         IHostingEnvironment env, 
         ILoggerFactory loggerFactory) 
{ 
    loggerFactory.MinimumLevel = LogLevel.Debug; 

    var sourceSwitch = new SourceSwitch("Sandbox.AspNet5.ApiApp-Demo"); 
    sourceSwitch.Level = SourceLevels.All; 
    loggerFactory.AddTraceSource(sourceSwitch, 
           new ConsoleTraceListener(false)); 
    loggerFactory.AddTraceSource(sourceSwitch, 
           new EventLogTraceListener("Application")); 
} 

Alle Ideen, was mache ich falsch?

+0

Hallo, haben Sie Ihre web.config überprüft? Gibt es einen klaren Zuhörer oder hast du den azuren richtig registriert? https://azure.microsoft.com/de-de/dokumentation/artikel/cloud-services-dotnet-diagnostics-trace-flow/ –

+0

Starten Sie den Protokolldatenstrom von Visual Studio aus im Cloud Explorer-Fenster (gehen Sie zur Website, klicken Sie mit der rechten Maustaste und sehen Sie sich Streaming-Protokolle an). Dies aktiviert das Protokoll-Streaming für eine Stunde. Der Log-Stream auf dem KUDU-Portal startet nicht immer nach meiner Erfahrung. –

+0

@MikeMiller Sind die Anweisungen, die Sie beziehen sich auf das gleiche für asp.net5? –

Antwort

9

Wenn Sie Ihre web.config betrachten, hat sie wahrscheinlich stdoutLogEnabled="false". Wenn Sie dies auf "true" setzen, wird alles, was in die Standardausgabe geschrieben wird, in eine Datei geschrieben. Und die stdoutLogFile bestimmt, wohin es geht, die standardmäßig unter d:\home\logfiles ist.

Jetzt müssen Sie sicherstellen, dass Ihre Protokollierung tatsächlich zu stdout geht. Doing würde definitiv funktionieren. Ich denke, es ist wahrscheinlich möglich, Dinge auch über ILoggerFactory in Ihrem startup.cs zu konfigurieren, um Logs zu stdout gehen zu lassen.

+1

Das wird die Logs in das Webapplikations-Dateisystem schreiben und ich habe gehofft herauszufinden, wie man sie zum azure Blobspeicher bringt, so wie es mit "altem" asp.net funktioniert. Sie erhalten das Kopfgeld aus Gnade, wenn niemand eine funktionierende Lösung bereitstellt, um die Protokolle zum Azure-Blobspeicher zu übertragen. –

+0

Es gibt keine Unterstützung dafür, obwohl es kommen wird. Sie könnten Ihre eigene Unterstützung schreiben (z. B. basierend auf https://github.com/davidebbo-test/ConsoleInterceptor), aber das würde ein bisschen Arbeit erfordern. –

+0

Ok, wissen Sie, ob es einen Monat oder drei (oder sechs) dauert, bis es fertig ist? –

5

bekam ich Streaming Log-Ausgang für eine App 5 Web ASP.NET arbeiten durch die folgende Klasse schreiben (basierend auf David Ebbo's example):

public class AzureApplicationLogTraceListener : TraceListener 
{ 
    private readonly string _logPath; 
    private readonly object _lock = new object(); 

    public AzureApplicationLogTraceListener() 
    { 
     string instanceId = Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID"); 
     if (instanceId != null) 
     { 
      string logFolder = Environment.ExpandEnvironmentVariables(@"%HOME%\LogFiles\application"); 
      Directory.CreateDirectory(logFolder); 
      instanceId = instanceId.Substring(0, 6); 
      _logPath = Path.Combine(logFolder, $"logs_{instanceId}.txt"); 

     } 
    } 

    public override void Write(string message) 
    { 
     if (_logPath != null) 
     { 
      lock (this) 
      { 
       File.AppendAllText(_logPath, message); 
      } 
     } 
    } 

    public override void WriteLine(string message) 
    { 
     Write(message + Environment.NewLine); 
    } 
} 

und setzen diese dann in meinem Startup.Configure:

Trace.Listeners.Add(new AzureApplicationLogTraceListener()); 

Dies unterstützt nur die Dateisystem-Protokollierung (ausreichend für Live-Protokoll-Streams).

+3

Funktioniert das nur für System.Diagnostics.Trace. *, Oder funktioniert es auch für die Verwendung von ILogger? –

+0

Arbeitete wie ein Charme. Vielen Dank. –

9

ich einen einfachen Trick für azur App gefunden haben, sehen https://github.com/aspnet/Logging/tree/dev/src/Microsoft.Extensions.Logging.AzureAppServices, bitte das Paket "Microsoft.Extensions.Logging.AzureAppServices" hinzufügen: "1.0.0-preview1-final" und Update-Abhängigkeiten, der hinzufügen azur Diagnostik in startup.cs wie folgt aus:

loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
loggerFactory.AddDebug(); 
loggerFactory.AddAzureWebAppDiagnostics(); // for default setting. 

oder für benutzerdefinierte Einstellung:

loggerFactory.AddAzureWebAppDiagnostics(new AzureAppServicesDiagnosticsSettings(...)); // add custom setting. 
// see here for detailed member properties: https://github.com/aspnet/Logging/blob/dev/src/Microsoft.Extensions.Logging.AzureAppServices/AzureAppServicesDiagnosticsSettings.cs 

und die Diagnostik auf azurblau, sind beide Anmeldung Blob und Datei Arbeit gut log ermöglichen. Keine Notwendigkeit für irgendeine zusätzliche Konfiguration . :)

Verwandte Themen