2017-01-16 13 views
7

W starym ASP.NET, w klasie Global.asax.cs, chciałbym logowania po uruchomieniu aplikacji, zatrzymuje się i rzuca nieobsłużonych wyjątków:Gdzie mogę rejestrować zdarzenia start/stop/błędu aplikacji ASP.NET Core?

  • Application_Start()
  • Application_End()
  • Application_Error()

jaki sposób Robię to samo w ASP.NET Core? Ma klasę Startup, ale jest przeznaczona do konfiguracji.

Gdzie mogę podłączyć się do zdarzeń start/stop/błędów aplikacji?

Odpowiedz

9

Trzeba użyć Microsoft.AspNetCore.Hosting.IApplicationLifetime

/// <summary> 
    /// Triggered when the application host has fully started and is about to wait 
    /// for a graceful shutdown. 
    /// </summary> 
    CancellationToken ApplicationStarted { get; } 

    /// <summary> 
    /// Triggered when the application host is performing a graceful shutdown. 
    /// Requests may still be in flight. Shutdown will block until this event completes. 
    /// </summary> 
    CancellationToken ApplicationStopping { get; } 

    /// <summary> 
    /// Triggered when the application host is performing a graceful shutdown. 
    /// All requests should be complete at this point. Shutdown will block 
    /// until this event completes. 
    /// </summary> 
    CancellationToken ApplicationStopped { get; } 

Instancji IApplicationLifetime można uzyskać w Configure metody. Również dodać ILoggerFactory tutaj:

public void Configure(IApplicationBuilder app, IApplicationLifetime applicationLifetime, ILoggerFactory loggerFactory) 
{ 
    // use applicationLifetime 
} 

Mając ILoggerFactory można create instancja ILogger:

var logger = loggerFactory.CreateLogger("StartupLogger"); 

Więc po prostu trzeba utworzyć właściwość w klasie startowego utrzymują się wystąpienie ILogger (lub ILoggerFactory , jeśli chcesz utworzyć inną instancję liggera dla różnych zdarzeń). Podsumowując:

public class Startup 
{ 
    private ILogger _logger; 

    public void Configure(IApplicationBuilder app, IApplicationLifetime applicationLifetime, ILoggerFactory loggerFactory) 
    { 
     applicationLifetime.ApplicationStopping.Register(OnShutdown); 
     ... 
     // add logger providers 
     // loggerFactory.AddConsole() 
     ... 
     _logger = loggerFactory.CreateLogger("StartupLogger"); 
    } 

    private void OnShutdown() 
    { 
     // use _logger here; 
    } 
} 
+0

Czy jest coś podobnego do nieobsłużonych wyjątków? – grokky

+0

Te metody [mogą być używane] (https://stackoverflow.com/a/35257670/7059613) do wykrywania rozpoczęcia/zatrzymania/zatrzymania. Ale jak byś się tam zalogował? Nie można odzyskać instancji rejestratora, ponieważ znajdujesz się w klasie "Startup"? – grokky

+0

@grokky zaktualizował odpowiedź – Set

1

proszę zobaczyć CaptureStartupErrors oraz metodę .CaptureStartupErrors(true), które pomogą Ci znaleźć problemy.

Jest to szczególnie przydatne, gdy coś działa idealnie na lokalnym hoście, ale kończy się niepowodzeniem na Azure.

Oto mój zwykły config dla NetCore Web Apps:

public static IWebHost BuildWebHost(string[] args) => WebHost 
      .CreateDefaultBuilder(args) 
      .CaptureStartupErrors(true) 
      .UseKestrel() 
      .UseIISIntegration() 
      .UseStartup<Startup>() 
      .UseAzureAppServices() 
      .Build(); 

W Azure App Służby możesz znaleźć dzienniki w strumieniu dziennika w Kudu Narzędzia https://<appname>.scm.azurewebsites.net/api/logstream

Powiązane problemy