Rejestrowanie w programie .NET Core i ASP.NET CoreLogging in .NET Core and ASP.NET Core

Autorzy Dykstra i Steve SmithBy Tom Dykstra and Steve Smith

Platforma .NET Core obsługuje interfejs API rejestrowania, który współpracuje z różnymi dostawcami rejestrowania wbudowanych i innych firm..NET Core supports a logging API that works with a variety of built-in and third-party logging providers. W tym artykule pokazano, jak używać interfejsu API rejestrowania z wbudowanymi dostawcami.This article shows how to use the logging API with built-in providers.

Większość przykładów kodu pokazanych w tym artykule pochodzą z ASP.NET Core aplikacji.Most of the code examples shown in this article are from ASP.NET Core apps. Części tych fragmentów kodu dotyczące rejestrowania mają zastosowanie do dowolnej aplikacji .NET Core, która korzysta z hosta ogólnego.The logging-specific parts of these code snippets apply to any .NET Core app that uses the Generic host. Aby uzyskać informacje na temat korzystania z hosta generycznego w aplikacjach konsolowych innych niż sieci Web, zobacz usługi hostowane.For information about how to use the Generic Host in non-web console apps, see Hosted services.

Rejestrowanie kodu dla aplikacji bez hosta ogólnego różni się w sposób, w jaki są dodawane dostawcy i są tworzone rejestratory.Logging code for apps without Generic Host differs in the way providers are added and loggers are created. Przykłady kodu niehosta są wyświetlane w tych częściach artykułu.Non-host code examples are shown in those sections of the article.

Wyświetlanie lub pobieranie przykładowego kodu (sposobu pobierania)View or download sample code (how to download)

Dodaj dostawcówAdd providers

Dostawca rejestrowania wyświetla lub przechowuje dzienniki.A logging provider displays or stores logs. Na przykład dostawca konsoli wyświetla dzienniki w konsoli programu, a Dostawca usługi Azure Application Insights przechowuje je na platformie Azure Application Insights.For example, the Console provider displays logs on the console, and the Azure Application Insights provider stores them in Azure Application Insights. Dzienniki mogą być wysyłane do wielu miejsc docelowych przez dodanie wielu dostawców.Logs can be sent to multiple destinations by adding multiple providers.

Aby dodać dostawcę w aplikacji korzystającej z hosta ogólnego, wywołaj metodę Add{provider name} rozszerzenia dostawcy w program.cs:To add a provider in an app that uses Generic Host, call the provider's Add{provider name} extension method in Program.cs:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.AddConsole();
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

W aplikacji konsolowej innej niż host Wywołaj metodę Add{provider name} rozszerzenia dostawcy podczas LoggerFactorytworzenia:In a non-host console app, call the provider's Add{provider name} extension method while creating a LoggerFactory:

var loggerFactory = LoggerFactory.Create(builder =>
{
    builder
        .AddFilter("Microsoft", LogLevel.Warning)
        .AddFilter("System", LogLevel.Warning)
        .AddFilter("LoggingConsoleApp.Program", LogLevel.Debug)
        .AddConsole()
        .AddEventLog();
});
ILogger logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("Example log message");

LoggerFactoryi AddConsole wymagająusing instrukcji dla Microsoft.Extensions.Logging.LoggerFactory and AddConsole require a using statement for Microsoft.Extensions.Logging.

Domyślne wywołanie CreateDefaultBuilderszablonów projektu ASP.NET Core, które dodaje następujących dostawców rejestrowania:The default ASP.NET Core project templates call CreateDefaultBuilder, which adds the following logging providers:

  • KonsolaConsole
  • DebugowanieDebug
  • EventSourceEventSource
  • EventLog (tylko w przypadku uruchamiania w systemie Windows)EventLog (only when running on Windows)

Dostawców domyślnych można zastąpić własnymi opcjami.You can replace the default providers with your own choices. Wywołaj ClearProvidersi Dodaj żądanych dostawców.Call ClearProviders, and add the providers you want.

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.AddConsole();
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

Aby dodać dostawcę, wywołaj metodę Add{provider name} rozszerzenia dostawcy w program.cs:To add a provider, call the provider's Add{provider name} extension method in Program.cs:

public static void Main(string[] args)
{
    var webHost = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            var env = hostingContext.HostingEnvironment;
            config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                  .AddJsonFile($"appsettings.{env.EnvironmentName}.json", 
                      optional: true, reloadOnChange: true);
            config.AddEnvironmentVariables();
        })
        .ConfigureLogging((hostingContext, logging) =>
        {
            // Requires `using Microsoft.Extensions.Logging;`
            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
            logging.AddDebug();
            logging.AddEventSourceLogger();
        })
        .UseStartup<Startup>()
        .Build();

    webHost.Run();
}

Poprzedzający kod wymaga odwołania do Microsoft.Extensions.Logging i Microsoft.Extensions.Configuration.The preceding code requires references to Microsoft.Extensions.Logging and Microsoft.Extensions.Configuration.

Domyślne wywołania CreateDefaultBuilderszablonu projektu, które dodaje następujących dostawców rejestrowania:The default project template calls CreateDefaultBuilder, which adds the following logging providers:

  • KonsolaConsole
  • DebugowanieDebug
  • EventSource (rozpoczęcie w ASP.NET Core 2,2)EventSource (starting in ASP.NET Core 2.2)
public static void Main(string[] args)
{
    CreateWebHostBuilder(args).Build().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>();

Jeśli używasz CreateDefaultBuilderprogramu, możesz zastąpić domyślnych dostawców własnymi opcjami.If you use CreateDefaultBuilder, you can replace the default providers with your own choices. Wywołaj ClearProvidersi Dodaj żądanych dostawców.Call ClearProviders, and add the providers you want.

public static void Main(string[] args)
{
    var host = CreateWebHostBuilder(args).Build();

    var todoRepository = host.Services.GetRequiredService<ITodoRepository>();
    todoRepository.Add(new Core.Model.TodoItem() { Name = "Feed the dog" });
    todoRepository.Add(new Core.Model.TodoItem() { Name = "Walk the dog" });

    var logger = host.Services.GetRequiredService<ILogger<Program>>();
    logger.LogInformation("Seeded the database.");

    host.Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.AddConsole();
        });

Więcej informacji na temat wbudowanych dostawców rejestrowania i dostawców rejestrowania innych firm znajduje się w dalszej części artykułu.Learn more about built-in logging providers and third-party logging providers later in the article.

Tworzenie dziennikówCreate logs

Aby utworzyć dzienniki, użyj ILogger<TCategoryName> obiektu.To create logs, use an ILogger<TCategoryName> object. W aplikacji sieci Web lub hostowanej usłudze Pobierz ILogger od iniekcji zależności (di).In a web app or hosted service, get an ILogger from dependency injection (DI). W aplikacjach konsolowych innych niż host Użyj LoggerFactory programu, aby ILoggerutworzyć.In non-host console apps, use the LoggerFactory to create an ILogger.

Poniższy ASP.NET Core przykład tworzy Rejestrator przy użyciu TodoApiSample.Pages.AboutModel jako kategorii.The following ASP.NET Core example creates a logger with TodoApiSample.Pages.AboutModel as the category. Kategoria dziennika jest ciągiem, który jest skojarzony z każdym dziennikiem.The log category is a string that is associated with each log. Wystąpienie zapewniane przez program di tworzy dzienniki, które mają w pełni kwalifikowaną nazwę T typu jako kategorię. ILogger<T>The ILogger<T> instance provided by DI creates logs that have the fully qualified name of type T as the category.

public class AboutModel : PageModel
{
    private readonly ILogger _logger;

    public AboutModel(ILogger<AboutModel> logger)
    {
        _logger = logger;
    }

Poniższy przykład aplikacji nieprzyjmującej konsoli tworzy Rejestrator z LoggingConsoleApp.Program kategorią.The following non-host console app example creates a logger with LoggingConsoleApp.Program as the category.

var loggerFactory = LoggerFactory.Create(builder =>
{
    builder
        .AddFilter("Microsoft", LogLevel.Warning)
        .AddFilter("System", LogLevel.Warning)
        .AddFilter("LoggingConsoleApp.Program", LogLevel.Debug)
        .AddConsole()
        .AddEventLog();
});
ILogger logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("Example log message");
public class AboutModel : PageModel
{
    private readonly ILogger _logger;

    public AboutModel(ILogger<AboutModel> logger)
    {
        _logger = logger;
    }

W poniższych przykładach ASP.NET Core i aplikacji konsoli Rejestrator służy do tworzenia dzienników z użyciem Information jako poziom.In the following ASP.NET Core and console app examples, the logger is used to create logs with Information as the level. Poziom dziennika wskazuje ważność rejestrowanego zdarzenia.The Log level indicates the severity of the logged event.

public void OnGet()
{
    Message = $"About page visited at {DateTime.UtcNow.ToLongTimeString()}";
    _logger.LogInformation("Message displayed: {Message}", Message);
}
var loggerFactory = LoggerFactory.Create(builder =>
{
    builder
        .AddFilter("Microsoft", LogLevel.Warning)
        .AddFilter("System", LogLevel.Warning)
        .AddFilter("LoggingConsoleApp.Program", LogLevel.Debug)
        .AddConsole()
        .AddEventLog();
});
ILogger logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("Example log message");
public void OnGet()
{
    Message = $"About page visited at {DateTime.UtcNow.ToLongTimeString()}";
    _logger.LogInformation("Message displayed: {Message}", Message);
}

Poziomy i Kategorie zostały wyjaśnione bardziej szczegółowo w dalszej części tego artykułu.Levels and categories are explained in more detail later in this article.

Tworzenie dzienników w klasie programuCreate logs in the Program class

Aby napisać dzienniki w Program klasie ASP.NET Core aplikacji, ILogger Pobierz wystąpienie z programu di po skompilowaniu hosta:To write logs in the Program class of an ASP.NET Core app, get an ILogger instance from DI after building the host:

public static void Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();

    var todoRepository = host.Services.GetRequiredService<ITodoRepository>();
    todoRepository.Add(new Core.Model.TodoItem() { Name = "Feed the dog" });
    todoRepository.Add(new Core.Model.TodoItem() { Name = "Walk the dog" });

    var logger = host.Services.GetRequiredService<ILogger<Program>>();
    logger.LogInformation("Seeded the database.");

    IMyService myService = host.Services.GetRequiredService<IMyService>();
    myService.WriteLog("Logged from MyService.");

    host.Run();
}

Tworzenie dzienników w klasie startowejCreate logs in the Startup class

Aby napisać dzienniki w Startup.Configure metodzie aplikacji ASP.NET Core, ILogger Dołącz parametr do sygnatury metody:To write logs in the Startup.Configure method of an ASP.NET Core app, include an ILogger parameter in the method signature:

public void Configure(IApplicationBuilder app, IHostEnvironment env, ILogger<Startup> logger)
{
    if (env.IsDevelopment())
    {
        logger.LogInformation("In Development environment");
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
        endpoints.MapRazorPages();
    });
}

Zapisywanie dzienników przed ukończeniem instalacji programu di Container w Startup.ConfigureServices metodzie nie jest obsługiwane:Writing logs before completion of the DI container setup in the Startup.ConfigureServices method is not supported:

  • Iniekcja rejestratora Startup do konstruktora nie jest obsługiwana.Logger injection into the Startup constructor is not supported.
  • Iniekcja rejestratora Startup.ConfigureServices do sygnatury metody nie jest obsługiwanaLogger injection into the Startup.ConfigureServices method signature is not supported

Przyczyną tego ograniczenia jest to, że rejestrowanie jest zależne od typu i konfiguracji, która z tego powodu zależy od DI.The reason for this restriction is that logging depends on DI and on configuration, which in turns depends on DI. Kontener di nie jest ustawiany do momentu ConfigureServices zakończenia.The DI container isn't set up until ConfigureServices finishes.

Wstrzykiwanie konstruktora rejestratora do Startup działa we wcześniejszych wersjach ASP.NET Core, ponieważ dla hosta sieci Web jest tworzony oddzielny kontener di.Constructor injection of a logger into Startup works in earlier versions of ASP.NET Core because a separate DI container is created for the Web Host. Aby uzyskać informacje o tym, dlaczego dla hosta generycznego jest tworzony tylko jeden kontener, zobacz zawiadomienie o rozdzieleniu zmian.For information about why only one container is created for the Generic Host, see the breaking change announcement.

Jeśli trzeba skonfigurować usługę, która zależy od ILogger<T>programu, można to zrobić za pomocą iniekcji konstruktora lub dostarczając metodę fabryki.If you need to configure a service that depends on ILogger<T>, you can still do that by using constructor injection or by providing a factory method. Podejście metody fabryki jest zalecane tylko wtedy, gdy nie ma żadnych innych opcji.The factory method approach is recommended only if there is no other option. Załóżmy na przykład, że musisz wypełnić Właściwość usługą z:For example, suppose you need to fill a property with a service from DI:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddRazorPages();

    services.AddSingleton<IMyService>((container) =>
    {
        var logger = container.GetRequiredService<ILogger<MyService>>();
        return new MyService() { Logger = logger };
    });

    services.AddSingleton<ITodoRepository, TodoRepository>();
}

Poprzedni wyróżniony kod jest Func uruchomiony, gdy jest uruchamiany po raz pierwszy kontener di musi utworzyć MyServicewystąpienie.The preceding highlighted code is a Func that runs the first time the DI container needs to construct an instance of MyService. W ten sposób można uzyskać dostęp do dowolnych zarejestrowanych usług.You can access any of the registered services in this way.

Tworzenie dzienników w programie startowymCreate logs in Startup

Aby napisać dzienniki w Startup klasie, ILogger Dołącz parametr do sygnatury konstruktora:To write logs in the Startup class, include an ILogger parameter in the constructor signature:

public class Startup
{
    private readonly ILogger _logger;

    public Startup(IConfiguration configuration, ILogger<Startup> logger)
    {
        Configuration = configuration;
        _logger = logger;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        // Add our repository type
        services.AddSingleton<ITodoRepository, TodoRepository>();
        _logger.LogInformation("Added TodoRepository to services");
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            _logger.LogInformation("In Development environment");
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

        app.UseMvc();
    }
}

Tworzenie dzienników w klasie programuCreate logs in the Program class

Aby napisać dzienniki w Program klasie, Pobierz wystąpienie z elementu ILogger di:To write logs in the Program class, get an ILogger instance from DI:

public static void Main(string[] args)
{
    var host = CreateWebHostBuilder(args).Build();

    var todoRepository = host.Services.GetRequiredService<ITodoRepository>();
    todoRepository.Add(new Core.Model.TodoItem() { Name = "Feed the dog" });
    todoRepository.Add(new Core.Model.TodoItem() { Name = "Walk the dog" });

    var logger = host.Services.GetRequiredService<ILogger<Program>>();
    logger.LogInformation("Seeded the database.");

    host.Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.AddConsole();
        });

Brak metod rejestratora asynchronicznegoNo asynchronous logger methods

Rejestracja powinna być tak szybka, że nie jest to koszt wydajności kodu asynchronicznego.Logging should be so fast that it isn't worth the performance cost of asynchronous code. Jeśli magazyn danych rejestrowania jest wolny, nie zapisuj go bezpośrednio.If your logging data store is slow, don't write to it directly. Najpierw Rozważ zapisanie komunikatów dziennika do szybkiego sklepu, a następnie przeniesienie ich do wolnego magazynu później.Consider writing the log messages to a fast store initially, then move them to the slow store later. Na przykład jeśli rejestrujesz się do SQL Server, nie chcesz tego robić bezpośrednio w Log metodzie, Log ponieważ metody są synchroniczne.For example, if you're logging to SQL Server, you don't want to do that directly in a Log method, since the Log methods are synchronous. Zamiast tego można synchronicznie dodawać komunikaty dziennika do kolejki w pamięci, a proces roboczy w tle ściągał komunikaty z kolejki, aby wykonać asynchroniczne działanie wypychania danych do SQL Server.Instead, synchronously add log messages to an in-memory queue and have a background worker pull the messages out of the queue to do the asynchronous work of pushing data to SQL Server.

KonfiguracjaConfiguration

Konfiguracja dostawcy rejestrowania jest świadczona przez co najmniej jednego dostawcę konfiguracji:Logging provider configuration is provided by one or more configuration providers:

  • Formaty plików (INI, JSON i XML).File formats (INI, JSON, and XML).
  • Argumenty wiersza polecenia.Command-line arguments.
  • Zmienne środowiskowe.Environment variables.
  • Obiekty platformy .NET w pamięci.In-memory .NET objects.
  • Magazyn niezaszyfrowanego klucza tajnego .The unencrypted Secret Manager storage.
  • Zaszyfrowany magazyn użytkowników, taki jak Azure Key Vault.An encrypted user store, such as Azure Key Vault.
  • Dostawcy niestandardowi (instalowani lub utworzony).Custom providers (installed or created).

Na przykład konfiguracja rejestrowania jest zwykle dostarczana przez Logging sekcję plików ustawień aplikacji.For example, logging configuration is commonly provided by the Logging section of app settings files. Poniższy przykład pokazuje zawartość typowej wartości appSettings. Plik Development. JSON :The following example shows the contents of a typical appsettings.Development.json file:

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    },
    "Console":
    {
      "IncludeScopes": true
    }
  }
}

Właściwość może mieć LogLevel właściwości dostawcy dzienników i. LoggingThe Logging property can have LogLevel and log provider properties (Console is shown).

Właściwość w obszarze Logging określa minimalny poziom rejestrowania wybranych kategorii. LogLevelThe LogLevel property under Logging specifies the minimum level to log for selected categories. W przykładzie, System i Microsoft kategorie są rejestrowane na Information poziomie, a wszystkie inne logowania na Debug poziomie.In the example, System and Microsoft categories log at Information level, and all others log at Debug level.

Inne właściwości w Logging obszarze Określ dostawców rejestrowania.Other properties under Logging specify logging providers. Przykład dotyczy dostawcy konsoli.The example is for the Console provider. Jeśli dostawca obsługuje zakresy rejestrowania, wskazuje IncludeScopes , czy są one włączone.If a provider supports log scopes, IncludeScopes indicates whether they're enabled. Właściwość dostawcy (taka jak Console w przykładzie) może także LogLevel określić właściwość.A provider property (such as Console in the example) may also specify a LogLevel property. LogLevelw obszarze dostawca Określa poziomy do rejestrowania dla tego dostawcy.LogLevel under a provider specifies levels to log for that provider.

Jeśli w programie Logging.{providername}.LogLevelsą określone poziomy, zastępują one wszystko Logging.LogLevelustawione w.If levels are specified in Logging.{providername}.LogLevel, they override anything set in Logging.LogLevel.

Informacje o implementowaniu dostawców konfiguracji znajdują Konfiguracja w ASP.NET Coresię w temacie.For information on implementing configuration providers, see Konfiguracja w ASP.NET Core.

Przykładowe dane wyjściowe rejestrowaniaSample logging output

W przypadku przykładowego kodu podanego w poprzedniej sekcji Dzienniki są wyświetlane w konsoli programu, gdy aplikacja jest uruchamiana z wiersza polecenia.With the sample code shown in the preceding section, logs appear in the console when the app is run from the command line. Oto przykład danych wyjściowych konsoli:Here's an example of console output:

info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/1.1 GET http://localhost:5000/api/todo/0
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 84.26180000000001ms 307
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 GET https://localhost:5001/api/todo/0
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'TodoApiSample.Controllers.TodoController.GetById (TodoApiSample)'
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[3]
      Route matched with {action = "GetById", controller = "Todo", page = ""}. Executing controller action with signature Microsoft.AspNetCore.Mvc.IActionResult GetById(System.String) on controller TodoApiSample.Controllers.TodoController (TodoApiSample).
info: TodoApiSample.Controllers.TodoController[1002]
      Getting item 0
warn: TodoApiSample.Controllers.TodoController[4000]
      GetById(0) NOT FOUND
info: Microsoft.AspNetCore.Mvc.StatusCodeResult[1]
      Executing HttpStatusCodeResult, setting HTTP status code 404
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:5000/api/todo/0
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Executing action method TodoApi.Controllers.TodoController.GetById (TodoApi) with arguments (0) - ModelState is Valid
info: TodoApi.Controllers.TodoController[1002]
      Getting item 0
warn: TodoApi.Controllers.TodoController[4000]
      GetById(0) NOT FOUND
info: Microsoft.AspNetCore.Mvc.StatusCodeResult[1]
      Executing HttpStatusCodeResult, setting HTTP status code 404
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action TodoApi.Controllers.TodoController.GetById (TodoApi) in 42.9286ms
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 148.889ms 404

Poprzednie dzienniki zostały wygenerowane przez utworzenie żądania HTTP GET do przykładowej aplikacji w lokalizacji http://localhost:5000/api/todo/0.The preceding logs were generated by making an HTTP Get request to the sample app at http://localhost:5000/api/todo/0.

Oto przykład tych samych dzienników, które są wyświetlane w oknie debugowania podczas uruchamiania przykładowej aplikacji w programie Visual Studio:Here's an example of the same logs as they appear in the Debug window when you run the sample app in Visual Studio:

Microsoft.AspNetCore.Hosting.Diagnostics: Information: Request starting HTTP/2.0 GET https://localhost:44328/api/todo/0  
Microsoft.AspNetCore.Routing.EndpointMiddleware: Information: Executing endpoint 'TodoApiSample.Controllers.TodoController.GetById (TodoApiSample)'
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker: Information: Route matched with {action = "GetById", controller = "Todo", page = ""}. Executing controller action with signature Microsoft.AspNetCore.Mvc.IActionResult GetById(System.String) on controller TodoApiSample.Controllers.TodoController (TodoApiSample).
TodoApiSample.Controllers.TodoController: Information: Getting item 0
TodoApiSample.Controllers.TodoController: Warning: GetById(0) NOT FOUND
Microsoft.AspNetCore.Mvc.StatusCodeResult: Information: Executing HttpStatusCodeResult, setting HTTP status code 404
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker: Information: Executed action TodoApiSample.Controllers.TodoController.GetById (TodoApiSample) in 34.167ms
Microsoft.AspNetCore.Routing.EndpointMiddleware: Information: Executed endpoint 'TodoApiSample.Controllers.TodoController.GetById (TodoApiSample)'
Microsoft.AspNetCore.Hosting.Diagnostics: Information: Request finished in 98.41300000000001ms 404

Dzienniki utworzone przez ILogger wywołania pokazane w poprzedniej sekcji zaczynają się od "TodoApiSample".The logs that are created by the ILogger calls shown in the preceding section begin with "TodoApiSample". Dzienniki zaczynające się od kategorii "Microsoft" pochodzą z kodu ASP.NET Core Framework.The logs that begin with "Microsoft" categories are from ASP.NET Core framework code. ASP.NET Core i kod aplikacji używają tego samego rejestrowania interfejsu API i dostawców.ASP.NET Core and application code are using the same logging API and providers.

Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 GET http://localhost:53104/api/todo/0  
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executing action method TodoApi.Controllers.TodoController.GetById (TodoApi) with arguments (0) - ModelState is Valid
TodoApi.Controllers.TodoController:Information: Getting item 0
TodoApi.Controllers.TodoController:Warning: GetById(0) NOT FOUND
Microsoft.AspNetCore.Mvc.StatusCodeResult:Information: Executing HttpStatusCodeResult, setting HTTP status code 404
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action TodoApi.Controllers.TodoController.GetById (TodoApi) in 152.5657ms
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 316.3195ms 404

Dzienniki utworzone przez ILogger wywołania pokazane w poprzedniej sekcji zaczynają się od "TodoApi".The logs that are created by the ILogger calls shown in the preceding section begin with "TodoApi". Dzienniki zaczynające się od kategorii "Microsoft" pochodzą z kodu ASP.NET Core Framework.The logs that begin with "Microsoft" categories are from ASP.NET Core framework code. ASP.NET Core i kod aplikacji używają tego samego rejestrowania interfejsu API i dostawców.ASP.NET Core and application code are using the same logging API and providers.

W pozostałej części tego artykułu opisano niektóre szczegóły i opcje rejestrowania.The remainder of this article explains some details and options for logging.

Pakiety NuGetNuGet packages

Interfejsy ILogger iILoggerFactory są w Microsoft. Extensions. Logging. Abstractsi domyślne implementacje dla nich są w Microsoft. Extensions. Logging.The ILogger and ILoggerFactory interfaces are in Microsoft.Extensions.Logging.Abstractions, and default implementations for them are in Microsoft.Extensions.Logging.

Kategoria dziennikaLog category

Po utworzeniu obiektu jest dla niego określona Kategoria. ILoggerWhen an ILogger object is created, a category is specified for it. Ta kategoria jest dołączona do każdego komunikatu dziennika utworzonego przez to wystąpienie ILogger.That category is included with each log message created by that instance of ILogger. Kategoria może być dowolnym ciągiem, ale Konwencja ma używać nazwy klasy, takiej jak "TodoApi. controllers. TodoController".The category may be any string, but the convention is to use the class name, such as "TodoApi.Controllers.TodoController".

Użyj ILogger<T> , aby ILogger uzyskać wystąpienie używające w T pełni kwalifikowanej nazwy typu jako kategorii:Use ILogger<T> to get an ILogger instance that uses the fully qualified type name of T as the category:

public class TodoController : Controller
{
    private readonly ITodoRepository _todoRepository;
    private readonly ILogger _logger;

    public TodoController(ITodoRepository todoRepository,
        ILogger<TodoController> logger)
    {
        _todoRepository = todoRepository;
        _logger = logger;
    }
public class TodoController : Controller
{
    private readonly ITodoRepository _todoRepository;
    private readonly ILogger _logger;

    public TodoController(ITodoRepository todoRepository,
        ILogger<TodoController> logger)
    {
        _todoRepository = todoRepository;
        _logger = logger;
    }

Aby jawnie określić kategorię, wywołaj ILoggerFactory.CreateLogger:To explicitly specify the category, call ILoggerFactory.CreateLogger:

public class TodoController : Controller
{
    private readonly ITodoRepository _todoRepository;
    private readonly ILogger _logger;

    public TodoController(ITodoRepository todoRepository,
        ILoggerFactory logger)
    {
        _todoRepository = todoRepository;
        _logger = logger.CreateLogger("TodoApiSample.Controllers.TodoController");
    }
public class TodoController : Controller
{
    private readonly ITodoRepository _todoRepository;
    private readonly ILogger _logger;

    public TodoController(ITodoRepository todoRepository,
        ILoggerFactory logger)
    {
        _todoRepository = todoRepository;
        _logger = logger.CreateLogger("TodoApiSample.Controllers.TodoController");
    }

ILogger<T>jest odpowiednikiem wywołania CreateLogger z w pełni kwalifikowaną Tnazwą typu.ILogger<T> is equivalent to calling CreateLogger with the fully qualified type name of T.

Poziom dziennikaLog level

Każdy dziennik Określa LogLevel wartość.Every log specifies a LogLevel value. Poziom dziennika wskazuje ważność lub ważność.The log level indicates the severity or importance. Przykładowo można napisać Information dziennik, gdy metoda jest zwykle zakończona Warning , a dziennik, gdy metoda zwraca 404, nie znaleziono kodu stanu.For example, you might write an Information log when a method ends normally and a Warning log when a method returns a 404 Not Found status code.

Poniższy kod tworzy Information i Warning rejestruje:The following code creates Information and Warning logs:

public IActionResult GetById(string id)
{
    _logger.LogInformation(LoggingEvents.GetItem, "Getting item {ID}", id);
    var item = _todoRepository.Find(id);
    if (item == null)
    {
        _logger.LogWarning(LoggingEvents.GetItemNotFound, "GetById({ID}) NOT FOUND", id);
        return NotFound();
    }
    return new ObjectResult(item);
}
public IActionResult GetById(string id)
{
    _logger.LogInformation(LoggingEvents.GetItem, "Getting item {ID}", id);
    var item = _todoRepository.Find(id);
    if (item == null)
    {
        _logger.LogWarning(LoggingEvents.GetItemNotFound, "GetById({ID}) NOT FOUND", id);
        return NotFound();
    }
    return new ObjectResult(item);
}

W powyższym kodzie pierwszy parametr jest IDENTYFIKATORem zdarzenia dziennika.In the preceding code, the first parameter is the Log event ID. Drugi parametr jest szablonem wiadomości z symbolami zastępczymi dla wartości argumentów dostarczonych przez pozostałe parametry metody.The second parameter is a message template with placeholders for argument values provided by the remaining method parameters. Parametry metody zostały wyjaśnione w sekcji szablon komunikatu w dalszej części tego artykułu.The method parameters are explained in the message template section later in this article.

Metody rejestrowania, które obejmują poziom w nazwie metody (na przykład LogInformation i LogWarning) są metodami rozszerzającymi dla ILogger.Log methods that include the level in the method name (for example, LogInformation and LogWarning) are extension methods for ILogger. Te metody wywołują Log metodę, która LogLevel pobiera parametr.These methods call a Log method that takes a LogLevel parameter. Log Metodę można wywołać bezpośrednio zamiast jednej z tych metod rozszerzających, ale składnia jest stosunkowo skomplikowana.You can call the Log method directly rather than one of these extension methods, but the syntax is relatively complicated. Aby uzyskać więcej informacji, ILogger Zobacz i kod źródłowy rozszerzeń rejestratora.For more information, see ILogger and the logger extensions source code.

ASP.NET Core definiuje następujące poziomy dziennika uporządkowane w tym miejscu od najniższej do najwyższej wagi.ASP.NET Core defines the following log levels, ordered here from lowest to highest severity.

  • Ślad = 0Trace = 0

    Aby uzyskać informacje, które są zazwyczaj cenne tylko dla debugowania.For information that's typically valuable only for debugging. Komunikaty te mogą zawierać poufne dane aplikacji, dlatego nie powinny być włączone w środowisku produkcyjnym.These messages may contain sensitive application data and so shouldn't be enabled in a production environment. Domyślnie wyłączona.Disabled by default.

  • Debuguj = 1Debug = 1

    Informacje, które mogą być przydatne podczas tworzenia i debugowania.For information that may be useful in development and debugging. Przykład: Entering method Configure with flag set to true.Włącz Debug dzienniki poziomów w środowisku produkcyjnym tylko w przypadku rozwiązywania problemów, ze względu na dużą ilość dzienników.Example: Entering method Configure with flag set to true. Enable Debug level logs in production only when troubleshooting, due to the high volume of logs.

  • Informacje = 2Information = 2

    Do śledzenia ogólnego przepływu aplikacji.For tracking the general flow of the app. Te dzienniki zwykle mają pewną wartość długoterminową.These logs typically have some long-term value. Przykład: Request received for path /api/todoExample: Request received for path /api/todo

  • Ostrzeżenie = 3Warning = 3

    Dla nietypowych lub nieoczekiwanych zdarzeń w przepływie aplikacji.For abnormal or unexpected events in the app flow. Mogą to być błędy lub inne warunki, które nie powodują zatrzymania aplikacji, ale konieczne może być zbadanie.These may include errors or other conditions that don't cause the app to stop but might need to be investigated. Obsłużone wyjątki są typowym miejscem do korzystania Warning z poziomu dziennika.Handled exceptions are a common place to use the Warning log level. Przykład: FileNotFoundException for file quotes.txt.Example: FileNotFoundException for file quotes.txt.

  • Błąd = 4Error = 4

    W przypadku błędów i wyjątków, których nie można obsłużyć.For errors and exceptions that cannot be handled. Te komunikaty wskazują niepowodzenie w bieżącym działaniu lub operacji (np. bieżące żądanie HTTP), a nie awaria całej aplikacji.These messages indicate a failure in the current activity or operation (such as the current HTTP request), not an app-wide failure. Przykładowy komunikat dziennika:Cannot insert record due to duplicate key violation.Example log message: Cannot insert record due to duplicate key violation.

  • Krytyczne = 5Critical = 5

    Dla niepowodzeń, które wymagają natychmiastowej uwagi.For failures that require immediate attention. Przykłady: scenariusze utraty danych, brak miejsca na dysku.Examples: data loss scenarios, out of disk space.

Poziom dziennika służy do kontrolowania, ile danych wyjściowych dziennika jest zapisywana w określonym nośniku lub oknie wyświetlania.Use the log level to control how much log output is written to a particular storage medium or display window. Na przykład:For example:

  • W obszarze produkcja, Trace Wyślij Information przez poziom do magazynu danych woluminu.In production, send Trace through Information level to a volume data store. Wyślij Warningdomagazynudanych wartości.CriticalSend Warning through Critical to a value data store.
  • Warning Podczas tworzenia, wysyłaj Critical do Trace konsoli i dodawaj podczas rozwiązywania problemów. InformationDuring development, send Warning through Critical to the console, and add Trace through Information when troubleshooting.

W sekcji filtrowanie dzienników w dalszej części tego artykułu wyjaśniono, jak kontrolować poziomy dzienników obsługiwane przez dostawcę.The Log filtering section later in this article explains how to control which log levels a provider handles.

ASP.NET Core zapisuje dzienniki dla zdarzeń struktury.ASP.NET Core writes logs for framework events. Przykłady dzienników znajdujące się wcześniej w tym artykule nie Information wykluczają dzienników Debug poniżej Trace , dlatego nie zostały utworzone dzienniki.The log examples earlier in this article excluded logs below Information level, so no Debug or Trace level logs were created. Oto przykład dzienników konsoli utworzonych przez uruchomienie przykładowej aplikacji skonfigurowanej do wyświetlania Debug dzienników:Here's an example of console logs produced by running the sample app configured to show Debug logs:

info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[3]
      Route matched with {action = "GetById", controller = "Todo", page = ""}. Executing controller action with signature Microsoft.AspNetCore.Mvc.IActionResult GetById(System.String) on controller TodoApiSample.Controllers.TodoController (TodoApiSample).
dbug: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[1]
      Execution plan of authorization filters (in the following order): None
dbug: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[1]
      Execution plan of resource filters (in the following order): Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter
dbug: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[1]
      Execution plan of action filters (in the following order): Microsoft.AspNetCore.Mvc.Filters.ControllerActionFilter (Order: -2147483648), Microsoft.AspNetCore.Mvc.ModelBinding.UnsupportedContentTypeFilter (Order: -3000)
dbug: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[1]
      Execution plan of exception filters (in the following order): None
dbug: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[1]
      Execution plan of result filters (in the following order): Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter
dbug: Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder[22]
      Attempting to bind parameter 'id' of type 'System.String' ...
dbug: Microsoft.AspNetCore.Mvc.ModelBinding.Binders.SimpleTypeModelBinder[44]
      Attempting to bind parameter 'id' of type 'System.String' using the name 'id' in request data ...
dbug: Microsoft.AspNetCore.Mvc.ModelBinding.Binders.SimpleTypeModelBinder[45]
      Done attempting to bind parameter 'id' of type 'System.String'.
dbug: Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder[23]
      Done attempting to bind parameter 'id' of type 'System.String'.
dbug: Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder[26]
      Attempting to validate the bound parameter 'id' of type 'System.String' ...
dbug: Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder[27]
      Done attempting to validate the bound parameter 'id' of type 'System.String'.
info: TodoApiSample.Controllers.TodoController[1002]
      Getting item 0
warn: TodoApiSample.Controllers.TodoController[4000]
      GetById(0) NOT FOUND
info: Microsoft.AspNetCore.Mvc.StatusCodeResult[1]
      Executing HttpStatusCodeResult, setting HTTP status code 404
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[2]
      Executed action TodoApiSample.Controllers.TodoController.GetById (TodoApiSample) in 32.690400000000004ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'TodoApiSample.Controllers.TodoController.GetById (TodoApiSample)'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 176.9103ms 404
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:62555/api/todo/0
dbug: Microsoft.AspNetCore.Routing.Tree.TreeRouter[1]
      Request successfully matched the route with name 'GetTodo' and template 'api/Todo/{id}'.
dbug: Microsoft.AspNetCore.Mvc.Internal.ActionSelector[2]
      Action 'TodoApi.Controllers.TodoController.Update (TodoApi)' with id '089d59b6-92ec-472d-b552-cc613dfd625d' did not match the constraint 'Microsoft.AspNetCore.Mvc.Internal.HttpMethodActionConstraint'
dbug: Microsoft.AspNetCore.Mvc.Internal.ActionSelector[2]
      Action 'TodoApi.Controllers.TodoController.Delete (TodoApi)' with id 'f3476abe-4bd9-4ad3-9261-3ead09607366' did not match the constraint 'Microsoft.AspNetCore.Mvc.Internal.HttpMethodActionConstraint'
dbug: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Executing action TodoApi.Controllers.TodoController.GetById (TodoApi)
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Executing action method TodoApi.Controllers.TodoController.GetById (TodoApi) with arguments (0) - ModelState is Valid
info: TodoApi.Controllers.TodoController[1002]
      Getting item 0
warn: TodoApi.Controllers.TodoController[4000]
      GetById(0) NOT FOUND
dbug: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action method TodoApi.Controllers.TodoController.GetById (TodoApi), returned result Microsoft.AspNetCore.Mvc.NotFoundResult.
info: Microsoft.AspNetCore.Mvc.StatusCodeResult[1]
      Executing HttpStatusCodeResult, setting HTTP status code 404
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action TodoApi.Controllers.TodoController.GetById (TodoApi) in 0.8788ms
dbug: Microsoft.AspNetCore.Server.Kestrel[9]
      Connection id "0HL6L7NEFF2QD" completed keep alive response.
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 2.7286ms 404

Identyfikator zdarzenia dziennikaLog event ID

Każdy dziennik może określać Identyfikator zdarzenia.Each log can specify an event ID. Aplikacja Przykładowa wykonuje to przy użyciu lokalnie zdefiniowanej LoggingEvents klasy:The sample app does this by using a locally defined LoggingEvents class:

public IActionResult GetById(string id)
{
    _logger.LogInformation(LoggingEvents.GetItem, "Getting item {ID}", id);
    var item = _todoRepository.Find(id);
    if (item == null)
    {
        _logger.LogWarning(LoggingEvents.GetItemNotFound, "GetById({ID}) NOT FOUND", id);
        return NotFound();
    }
    return new ObjectResult(item);
}
public class LoggingEvents
{
    public const int GenerateItems = 1000;
    public const int ListItems = 1001;
    public const int GetItem = 1002;
    public const int InsertItem = 1003;
    public const int UpdateItem = 1004;
    public const int DeleteItem = 1005;

    public const int GetItemNotFound = 4000;
    public const int UpdateItemNotFound = 4001;
}
public IActionResult GetById(string id)
{
    _logger.LogInformation(LoggingEvents.GetItem, "Getting item {ID}", id);
    var item = _todoRepository.Find(id);
    if (item == null)
    {
        _logger.LogWarning(LoggingEvents.GetItemNotFound, "GetById({ID}) NOT FOUND", id);
        return NotFound();
    }
    return new ObjectResult(item);
}
public class LoggingEvents
{
    public const int GenerateItems = 1000;
    public const int ListItems = 1001;
    public const int GetItem = 1002;
    public const int InsertItem = 1003;
    public const int UpdateItem = 1004;
    public const int DeleteItem = 1005;

    public const int GetItemNotFound = 4000;
    public const int UpdateItemNotFound = 4001;
}

Identyfikator zdarzenia kojarzy zestaw zdarzeń.An event ID associates a set of events. Na przykład wszystkie dzienniki związane z wyświetlaniem listy elementów na stronie mogą być 1001.For example, all logs related to displaying a list of items on a page might be 1001.

Dostawca rejestrowania może przechowywać identyfikator zdarzenia w polu identyfikatora, w komunikacie rejestrowania lub wcale.The logging provider may store the event ID in an ID field, in the logging message, or not at all. Dostawca debugowania nie pokazuje identyfikatorów zdarzeń.The Debug provider doesn't show event IDs. Dostawca konsoli pokazuje identyfikatory zdarzeń w nawiasach po kategorii:The console provider shows event IDs in brackets after the category:

info: TodoApi.Controllers.TodoController[1002]
      Getting item invalidid
warn: TodoApi.Controllers.TodoController[4000]
      GetById(invalidid) NOT FOUND

Szablon komunikatu dziennikaLog message template

Każdy dziennik Określa szablon wiadomości.Each log specifies a message template. Szablon wiadomości może zawierać symbole zastępcze, dla których podano argumenty.The message template can contain placeholders for which arguments are provided. Użyj nazw dla symboli zastępczych, a nie liczby.Use names for the placeholders, not numbers.

public IActionResult GetById(string id)
{
    _logger.LogInformation(LoggingEvents.GetItem, "Getting item {ID}", id);
    var item = _todoRepository.Find(id);
    if (item == null)
    {
        _logger.LogWarning(LoggingEvents.GetItemNotFound, "GetById({ID}) NOT FOUND", id);
        return NotFound();
    }
    return new ObjectResult(item);
}
public IActionResult GetById(string id)
{
    _logger.LogInformation(LoggingEvents.GetItem, "Getting item {ID}", id);
    var item = _todoRepository.Find(id);
    if (item == null)
    {
        _logger.LogWarning(LoggingEvents.GetItemNotFound, "GetById({ID}) NOT FOUND", id);
        return NotFound();
    }
    return new ObjectResult(item);
}

Kolejność symboli zastępczych, nie ich nazw, określa, które parametry są używane do dostarczania ich wartości.The order of placeholders, not their names, determines which parameters are used to provide their values. W poniższym kodzie Zwróć uwagę, że nazwy parametrów są poza kolejnością w szablonie wiadomości:In the following code, notice that the parameter names are out of sequence in the message template:

string p1 = "parm1";
string p2 = "parm2";
_logger.LogInformation("Parameter values: {p2}, {p1}", p1, p2);

Ten kod tworzy komunikat dziennika z wartościami parametrów w kolejności:This code creates a log message with the parameter values in sequence:

Parameter values: parm1, parm2

Struktura rejestrowania działa w ten sposób, aby dostawcy rejestrowania mogli zaimplementować Rejestrowanie semantyczne, znane także jako rejestrowanie strukturalne.The logging framework works this way so that logging providers can implement semantic logging, also known as structured logging. Same argumenty są przesyłane do systemu rejestrowania, a nie tylko dla sformatowanego szablonu wiadomości.The arguments themselves are passed to the logging system, not just the formatted message template. Te informacje umożliwiają dostawcom rejestrowania przechowywanie wartości parametrów jako pól.This information enables logging providers to store the parameter values as fields. Na przykład załóżmy, że wywołania metod rejestratora wyglądają następująco:For example, suppose logger method calls look like this:

_logger.LogInformation("Getting item {ID} at {RequestTime}", id, DateTime.Now);

W przypadku wysyłania dzienników do usługi Azure Table Storage każda jednostka tabeli platformy Azure może mieć ID właściwości i RequestTime , które upraszczają zapytania dotyczące danych dziennika.If you're sending the logs to Azure Table Storage, each Azure Table entity can have ID and RequestTime properties, which simplifies queries on log data. Zapytanie może znaleźć wszystkie dzienniki w określonym RequestTime zakresie bez analizowania limitu czasu wiadomości tekstowej.A query can find all logs within a particular RequestTime range without parsing the time out of the text message.

Wyjątki rejestrowaniaLogging exceptions

Metody rejestratora mają przeciążenia umożliwiające przekazanie wyjątku, jak w poniższym przykładzie:The logger methods have overloads that let you pass in an exception, as in the following example:

catch (Exception ex)
{
    _logger.LogWarning(LoggingEvents.GetItemNotFound, ex, "GetById({ID}) NOT FOUND", id);
    return NotFound();
}
return new ObjectResult(item);
catch (Exception ex)
{
    _logger.LogWarning(LoggingEvents.GetItemNotFound, ex, "GetById({ID}) NOT FOUND", id);
    return NotFound();
}
return new ObjectResult(item);

Różni dostawcy obsługują informacje o wyjątkach na różne sposoby.Different providers handle the exception information in different ways. Oto przykład danych wyjściowych dostawcy debugowania z kodu pokazanego powyżej.Here's an example of Debug provider output from the code shown above.

TodoApiSample.Controllers.TodoController: Warning: GetById(55) NOT FOUND

System.Exception: Item not found exception.
   at TodoApiSample.Controllers.TodoController.GetById(String id) in C:\TodoApiSample\Controllers\TodoController.cs:line 226

Filtrowanie dziennikówLog filtering

Można określić minimalny poziom rejestrowania dla określonego dostawcy i kategorii lub dla wszystkich dostawców lub wszystkich kategorii.You can specify a minimum log level for a specific provider and category or for all providers or all categories. Wszystkie dzienniki poniżej minimalnego poziomu nie są przesyłane do tego dostawcy, więc nie są wyświetlane ani przechowywane.Any logs below the minimum level aren't passed to that provider, so they don't get displayed or stored.

Aby pominąć wszystkie dzienniki, określ LogLevel.None jako minimalny poziom dziennika.To suppress all logs, specify LogLevel.None as the minimum log level. Wartość LogLevel.None całkowita wynosi 6, która jest większa niż LogLevel.Critical (5).The integer value of LogLevel.None is 6, which is higher than LogLevel.Critical (5).

Utwórz reguły filtru w konfiguracjiCreate filter rules in configuration

Kod szablonu projektu wywołuje CreateDefaultBuilder w celu skonfigurowania rejestrowania dla dostawców konsoli i debugowania.The project template code calls CreateDefaultBuilder to set up logging for the Console and Debug providers. Metoda konfiguruje rejestrowanie, aby wyszukać konfigurację Logging w sekcji, jak wyjaśniono wcześniej w tym artykule. CreateDefaultBuilderThe CreateDefaultBuilder method sets up logging to look for configuration in a Logging section, as explained earlier in this article.

Dane konfiguracyjne określają minimalne poziomy dziennika według dostawcy i kategorii, jak w poniższym przykładzie:The configuration data specifies minimum log levels by provider and category, as in the following example:

{
  "Logging": {
    "Debug": {
      "LogLevel": {
        "Default": "Information"
      }
    },
    "Console": {
      "IncludeScopes": false,
      "LogLevel": {
        "Microsoft.AspNetCore.Mvc.Razor.Internal": "Warning",
        "Microsoft.AspNetCore.Mvc.Razor.Razor": "Debug",
        "Microsoft.AspNetCore.Mvc.Razor": "Error",
        "Default": "Information"
      }
    },
    "LogLevel": {
      "Default": "Debug"
    }
  }
}
{
  "Logging": {
    "Debug": {
      "LogLevel": {
        "Default": "Information"
      }
    },
    "Console": {
      "IncludeScopes": false,
      "LogLevel": {
        "Microsoft.AspNetCore.Mvc.Razor.Internal": "Warning",
        "Microsoft.AspNetCore.Mvc.Razor.Razor": "Debug",
        "Microsoft.AspNetCore.Mvc.Razor": "Error",
        "Default": "Information"
      }
    },
    "LogLevel": {
      "Default": "Debug"
    }
  }
}

Ten kod JSON tworzy sześć reguł filtrowania: jeden dla dostawcy debugowania, cztery dla dostawcy konsoli i jeden dla wszystkich dostawców.This JSON creates six filter rules: one for the Debug provider, four for the Console provider, and one for all providers. Dla każdego dostawcy wybierana jest pojedyncza reguła, ILogger gdy tworzony jest obiekt.A single rule is chosen for each provider when an ILogger object is created.

Filtrowanie reguł w kodzieFilter rules in code

Poniższy przykład pokazuje, jak zarejestrować reguły filtru w kodzie:The following example shows how to register filter rules in code:

.ConfigureLogging(logging =>
    logging.AddFilter("System", LogLevel.Debug)
           .AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Trace))
WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .ConfigureLogging(logging =>
        logging.AddFilter("System", LogLevel.Debug)
               .AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Trace));

Drugi AddFilter określa dostawcę debugowania za pomocą nazwy typu.The second AddFilter specifies the Debug provider by using its type name. Pierwszy AddFilter ma zastosowanie do wszystkich dostawców, ponieważ nie określa typu dostawcy.The first AddFilter applies to all providers because it doesn't specify a provider type.

Jak są stosowane reguły filtrowaniaHow filtering rules are applied

Dane konfiguracji i AddFilter kod przedstawiony w powyższych przykładach tworzą reguły pokazane w poniższej tabeli.The configuration data and the AddFilter code shown in the preceding examples create the rules shown in the following table. Pierwsze sześć pochodzi z przykładu konfiguracji, a ostatnie dwa pochodzą z przykładu kodu.The first six come from the configuration example and the last two come from the code example.

Wartość liczbowaNumber DostawcaProvider Kategorie zaczynające się od...Categories that begin with ... Minimalny poziom rejestrowaniaMinimum log level
11 DebugowanieDebug Wszystkie kategorieAll categories InformacjeInformation
22 KonsolaConsole Microsoft.AspNetCore.Mvc.Razor.InternalMicrosoft.AspNetCore.Mvc.Razor.Internal OstrzeżenieWarning
33 KonsolaConsole Microsoft.AspNetCore.Mvc.Razor.RazorMicrosoft.AspNetCore.Mvc.Razor.Razor DebugowanieDebug
44 KonsolaConsole Microsoft.AspNetCore.Mvc.RazorMicrosoft.AspNetCore.Mvc.Razor BłądError
55 KonsolaConsole Wszystkie kategorieAll categories InformacjeInformation
66 Wszyscy dostawcyAll providers Wszystkie kategorieAll categories DebugowanieDebug
77 Wszyscy dostawcyAll providers SystemSystem DebugowanieDebug
88 DebugowanieDebug MicrosoftMicrosoft SzukaTrace

Po utworzeniu ILogger ILoggerFactory obiektu obiekt wybiera jedną regułę dla każdego dostawcy, która ma zostać zastosowana do tego rejestratora.When an ILogger object is created, the ILoggerFactory object selects a single rule per provider to apply to that logger. Wszystkie komunikaty zapisywane przez ILogger wystąpienie są filtrowane na podstawie wybranych reguł.All messages written by an ILogger instance are filtered based on the selected rules. Najbardziej konkretną regułą można wybrać dla każdego dostawcy i pary kategorii z dostępnych reguł.The most specific rule possible for each provider and category pair is selected from the available rules.

Następujący algorytm jest używany dla każdego dostawcy, ILogger gdy jest tworzony dla danej kategorii:The following algorithm is used for each provider when an ILogger is created for a given category:

  • Wybierz wszystkie reguły, które pasują do dostawcy lub jego aliasu.Select all rules that match the provider or its alias. Jeśli nie zostanie znalezione dopasowanie, zaznacz wszystkie reguły z pustym dostawcą.If no match is found, select all rules with an empty provider.
  • W wyniku poprzedniego kroku wybierz pozycję reguły z najdłuższym prefiksem kategorii.From the result of the preceding step, select rules with longest matching category prefix. Jeśli nie zostanie znalezione dopasowanie, zaznacz wszystkie reguły, które nie określają kategorii.If no match is found, select all rules that don't specify a category.
  • Jeśli wybrano wiele reguł, zrób to ostatnie .If multiple rules are selected, take the last one.
  • Jeśli nie wybrano żadnych reguł, MinimumLevelUżyj.If no rules are selected, use MinimumLevel.

Na powyższej liście reguł Załóżmy, że ILogger tworzysz obiekt dla kategorii "Microsoft. AspNetCore. MVC. Razor. RazorViewEngine":With the preceding list of rules, suppose you create an ILogger object for category "Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine":

  • Dla dostawcy debugowania obowiązują reguły 1, 6 i 8.For the Debug provider, rules 1, 6, and 8 apply. Reguła 8 jest najbardziej specyficzna, więc jest to jedna wybrana.Rule 8 is most specific, so that's the one selected.
  • W przypadku dostawcy konsoli obowiązują reguły 3, 4, 5 i 6.For the Console provider, rules 3, 4, 5, and 6 apply. Reguła 3 jest najbardziej specyficzna.Rule 3 is most specific.

Wystąpienie wyników ILogger wysyła Trace dzienniki poziomu i powyżej do dostawcy debugowania.The resulting ILogger instance sends logs of Trace level and above to the Debug provider. Debug Dzienniki poziomów i powyżej są wysyłane do dostawcy konsoli.Logs of Debug level and above are sent to the Console provider.

Aliasy dostawcówProvider aliases

Każdy dostawca definiuje alias , który może być używany w konfiguracji zamiast w pełni kwalifikowanej nazwy typu.Each provider defines an alias that can be used in configuration in place of the fully qualified type name. W przypadku dostawców wbudowanych Użyj następujących aliasów:For the built-in providers, use the following aliases:

  • KonsolaConsole
  • DebugowanieDebug
  • EventSourceEventSource
  • ElemencieEventLog
  • TraceSourceTraceSource
  • AzureAppServicesFileAzureAppServicesFile
  • AzureAppServicesBlobAzureAppServicesBlob
  • ApplicationInsightsApplicationInsights

Domyślny poziom minimalnyDefault minimum level

Istnieje ustawienie minimalnego poziomu, które działa tylko wtedy, gdy nie mają zastosowania żadne reguły z konfiguracji lub kodu dla danego dostawcy i kategorii.There's a minimum level setting that takes effect only if no rules from configuration or code apply for a given provider and category. Poniższy przykład pokazuje, jak ustawić poziom minimalny:The following example shows how to set the minimum level:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logging => logging.SetMinimumLevel(LogLevel.Warning))
WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .ConfigureLogging(logging => logging.SetMinimumLevel(LogLevel.Warning));

Jeśli poziom minimalny nie został jawnie ustawiony, wartość domyślna to Information, co oznacza, że Trace dzienniki i Debug są ignorowane.If you don't explicitly set the minimum level, the default value is Information, which means that Trace and Debug logs are ignored.

Funkcje filtrowaniaFilter functions

Funkcja filtru jest wywoływana dla wszystkich dostawców i kategorii, które nie mają przypisanych do nich reguł przez konfigurację lub kod.A filter function is invoked for all providers and categories that don't have rules assigned to them by configuration or code. Kod w funkcji ma dostęp do typu dostawcy, kategorii i poziomu dziennika.Code in the function has access to the provider type, category, and log level. Na przykład:For example:

.ConfigureLogging(logBuilder =>
{
    logBuilder.AddFilter((provider, category, logLevel) =>
    {
        if (provider == "Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider" &&
            category == "TodoApiSample.Controllers.TodoController")
        {
            return false;
        }
        return true;
    });
})
WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .ConfigureLogging(logBuilder =>
    {
        logBuilder.AddFilter((provider, category, logLevel) =>
        {
            if (provider == "Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider" &&
                category == "TodoApiSample.Controllers.TodoController")
            {
                return false;
            }
            return true;
        });
    });

Kategorie i poziomy systemuSystem categories and levels

Poniżej przedstawiono niektóre kategorie używane przez ASP.NET Core i Entity Framework Core, z informacjami o dziennikach, od których należy się spodziewać:Here are some categories used by ASP.NET Core and Entity Framework Core, with notes about what logs to expect from them:

KategoriaCategory UwagiNotes
Microsoft.AspNetCoreMicrosoft.AspNetCore Ogólna Diagnostyka ASP.NET Core.General ASP.NET Core diagnostics.
Microsoft.AspNetCore.DataProtectionMicrosoft.AspNetCore.DataProtection Które klucze zostały wzięte pod uwagę, znaleziono i użyte.Which keys were considered, found, and used.
Microsoft.AspNetCore.HostFilteringMicrosoft.AspNetCore.HostFiltering Dozwolone hosty.Hosts allowed.
Microsoft.AspNetCore.HostingMicrosoft.AspNetCore.Hosting Jak długo trwa wykonywanie żądań HTTP i czas ich uruchomienia.How long HTTP requests took to complete and what time they started. Które hostowanie zestawów uruchamiania zostało załadowane.Which hosting startup assemblies were loaded.
Microsoft.AspNetCore.MvcMicrosoft.AspNetCore.Mvc Diagnostyka MVC i Razor.MVC and Razor diagnostics. Powiązanie modelu, wykonywanie filtru, kompilacja widoku, wybór akcji.Model binding, filter execution, view compilation, action selection.
Microsoft.AspNetCore.RoutingMicrosoft.AspNetCore.Routing Informacje o trasie.Route matching information.
Microsoft.AspNetCore.ServerMicrosoft.AspNetCore.Server Reagowanie na uruchamianie, zatrzymywanie i utrzymywanie aktywności.Connection start, stop, and keep alive responses. Informacje o certyfikacie HTTPS.HTTPS certificate information.
Microsoft.AspNetCore.StaticFilesMicrosoft.AspNetCore.StaticFiles Obsługiwane pliki.Files served.
Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore Ogólna Diagnostyka Entity Framework Core.General Entity Framework Core diagnostics. Aktywność i Konfiguracja bazy danych, wykrywanie zmian, migracje.Database activity and configuration, change detection, migrations.

Zakresy dziennikaLog scopes

Zakres może grupować zestaw operacji logicznych.A scope can group a set of logical operations. Takie grupowanie może służyć do dołączania tych samych danych do każdego dziennika, który został utworzony jako część zestawu.This grouping can be used to attach the same data to each log that's created as part of a set. Na przykład każdy dziennik utworzony w ramach przetwarzania transakcji może zawierać identyfikator transakcji.For example, every log created as part of processing a transaction can include the transaction ID.

Zakres jest IDisposable typem zwracanym BeginScope przez metodę i obowiązuje do momentu jego usunięcia.A scope is an IDisposable type that's returned by the BeginScope method and lasts until it's disposed. Użyj zakresu przez Zawijanie wywołań rejestratora w using bloku:Use a scope by wrapping logger calls in a using block:

public IActionResult GetById(string id)
{
    TodoItem item;
    using (_logger.BeginScope("Message attached to logs created in the using block"))
    {
        _logger.LogInformation(LoggingEvents.GetItem, "Getting item {ID}", id);
        item = _todoRepository.Find(id);
        if (item == null)
        {
            _logger.LogWarning(LoggingEvents.GetItemNotFound, "GetById({ID}) NOT FOUND", id);
            return NotFound();
        }
    }
    return new ObjectResult(item);
}
public IActionResult GetById(string id)
{
    TodoItem item;
    using (_logger.BeginScope("Message attached to logs created in the using block"))
    {
        _logger.LogInformation(LoggingEvents.GetItem, "Getting item {ID}", id);
        item = _todoRepository.Find(id);
        if (item == null)
        {
            _logger.LogWarning(LoggingEvents.GetItemNotFound, "GetById({ID}) NOT FOUND", id);
            return NotFound();
        }
    }
    return new ObjectResult(item);
}

Poniższy kod włącza zakresy dla dostawcy konsoli:The following code enables scopes for the console provider:

Program.cs:Program.cs:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging((hostingContext, logging) =>
        {
            logging.ClearProviders();
            logging.AddConsole(options => options.IncludeScopes = true);
            logging.AddDebug();
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });
.ConfigureLogging((hostingContext, logging) =>
{
    logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
    logging.AddConsole(options => options.IncludeScopes = true);
    logging.AddDebug();
})

Uwaga

Konfigurowanie opcji rejestratora konsoli jest wymagane do włączenia rejestrowania na podstawie zakresu. IncludeScopesConfiguring the IncludeScopes console logger option is required to enable scope-based logging.

Informacje o konfiguracji znajdują się w sekcji Konfiguracja .For information on configuration, see the Configuration section.

Każdy komunikat dziennika zawiera informacje o zakresie:Each log message includes the scoped information:

info: TodoApiSample.Controllers.TodoController[1002]
      => RequestId:0HKV9C49II9CK RequestPath:/api/todo/0 => TodoApiSample.Controllers.TodoController.GetById (TodoApi) => Message attached to logs created in the using block
      Getting item 0
warn: TodoApiSample.Controllers.TodoController[4000]
      => RequestId:0HKV9C49II9CK RequestPath:/api/todo/0 => TodoApiSample.Controllers.TodoController.GetById (TodoApi) => Message attached to logs created in the using block
      GetById(0) NOT FOUND

Wbudowani dostawcy rejestrowaniaBuilt-in logging providers

ASP.NET Core dostarcza następujących dostawców:ASP.NET Core ships the following providers:

Aby uzyskać informacje na temat strumienia stdout i rejestrowania debugowania za pomocą modułu Rozwiązywanie problemów ASP.NET Core na Azure App Service i usługach IIS ASP.NET Core Moduł ASP.NET Core, zobacz i.For information on stdout and debug logging with the ASP.NET Core Module, see Rozwiązywanie problemów ASP.NET Core na Azure App Service i usługach IIS and Moduł ASP.NET Core.

Dostawca konsoliConsole provider

Pakiet Microsoft. Extensions. Logging. Console Provider wysyła dane wyjściowe dziennika do konsoli programu.The Microsoft.Extensions.Logging.Console provider package sends log output to the console.

logging.AddConsole();

Aby wyświetlić dane wyjściowe rejestrowania konsoli, Otwórz wiersz polecenia w folderze projektu i uruchom następujące polecenie:To see console logging output, open a command prompt in the project folder and run the following command:

dotnet run

Dostawca debugowaniaDebug provider

Pakiet Microsoft. Extensions. Logging. Debug Provider zapisuje dane wyjściowe dziennika przy użyciu klasy System. Diagnostics. Debug (Debug.WriteLine wywołania metod).The Microsoft.Extensions.Logging.Debug provider package writes log output by using the System.Diagnostics.Debug class (Debug.WriteLine method calls).

W systemie Linux ten dostawca zapisuje dzienniki do /var/log/Message.On Linux, this provider writes logs to /var/log/message.

logging.AddDebug();

Dostawca EventSourceEventSource provider

W przypadku aplikacji przeznaczonych do ASP.NET Core 1.1.0 lub nowszych pakiet dostawcy Microsoft. Extensions. Logging. EventSource może zaimplementować śledzenie zdarzeń.For apps that target ASP.NET Core 1.1.0 or later, the Microsoft.Extensions.Logging.EventSource provider package can implement event tracing. W systemie Windows używa funkcji ETW.On Windows, it uses ETW. Dostawca jest międzyplatformowy, ale nie ma jeszcze kolekcji zdarzeń i narzędzi do wyświetlania dla systemu Linux lub macOS.The provider is cross-platform, but there are no event collection and display tools yet for Linux or macOS.

logging.AddEventSourceLogger();

Dobrym sposobem na zbieranie i wyświetlanie dzienników jest użycie Narzędzia Narzędzia PerfView.A good way to collect and view logs is to use the PerfView utility. Istnieją inne narzędzia do wyświetlania dzienników ETW, ale narzędzia PerfView zapewnia najlepsze środowisko pracy z zdarzeniami ETW emitowanymi przez ASP.NET Core.There are other tools for viewing ETW logs, but PerfView provides the best experience for working with the ETW events emitted by ASP.NET Core.

Aby skonfigurować narzędzia PerfView do zbierania zdarzeń rejestrowanych przez tego dostawcę, Dodaj ciąg *Microsoft-Extensions-Logging do listy dodatkowych dostawców .To configure PerfView for collecting events logged by this provider, add the string *Microsoft-Extensions-Logging to the Additional Providers list. (Nie przegap gwiazdki na początku ciągu znaków).(Don't miss the asterisk at the start of the string.)

Narzędzia PerfView dodatkowych dostawców

Dostawca dziennika zdarzeń systemu WindowsWindows EventLog provider

Pakiet dostawcy Microsoft. Extensions. Logging. EventLog wysyła dane wyjściowe dziennika do dziennika zdarzeń systemu Windows.The Microsoft.Extensions.Logging.EventLog provider package sends log output to the Windows Event Log.

logging.AddEventLog();

EventLoggerFactoryExtensions Przeciążenia addeventlog umożliwiają przekazywanie EventLogSettings.AddEventLog overloads let you pass in EventLogSettings.

Dostawca TraceSourceTraceSource provider

Pakiet dostawcy Microsoft. Extensions. Logging. TraceSource używa TraceSource bibliotek i dostawców.The Microsoft.Extensions.Logging.TraceSource provider package uses the TraceSource libraries and providers.

logging.AddTraceSource(sourceSwitchName);

Przeciążenia AddTraceSource umożliwiają przekazywanie danych w przełączniku źródłowym i odbiorniku śledzenia.AddTraceSource overloads let you pass in a source switch and a trace listener.

Aby można było korzystać z tego dostawcy, aplikacja musi działać na .NET Framework (a nie na platformie .NET Core).To use this provider, an app has to run on the .NET Framework (rather than .NET Core). Dostawca może kierować komunikaty do różnych odbiorników, takich jak TextWriterTraceListener używane w przykładowej aplikacji.The provider can route messages to a variety of listeners, such as the TextWriterTraceListener used in the sample app.

Dostawca Azure App ServiceAzure App Service provider

Pakiet Microsoft. Extensions. Logging. AzureAppServices Provider zapisuje dzienniki w plikach tekstowych w systemie plików aplikacji Azure App Service i w usłudze BLOB Storage na koncie usługi Azure Storage.The Microsoft.Extensions.Logging.AzureAppServices provider package writes logs to text files in an Azure App Service app's file system and to blob storage in an Azure Storage account.

logging.AddAzureWebAppDiagnostics();

Pakiet dostawcy nie jest uwzględniony w udostępnionej infrastrukturze.The provider package isn't included in the shared framework. Aby użyć dostawcy, Dodaj pakiet dostawcy do projektu.To use the provider, add the provider package to the project.

Pakiet dostawcy nie jest uwzględniony w pakiecie Microsoft. AspNetCore. app.The provider package isn't included in the Microsoft.AspNetCore.App metapackage. Podczas określania elementu docelowego .NET Framework lub Microsoft.AspNetCore.App odwoływania się do niego, Dodaj pakiet dostawcy do projektu.When targeting .NET Framework or referencing the Microsoft.AspNetCore.App metapackage, add the provider package to the project.

Aby skonfigurować ustawienia dostawcy, użyj AzureFileLoggerOptions i AzureBlobLoggerOptions, jak pokazano w następującym przykładzie:To configure provider settings, use AzureFileLoggerOptions and AzureBlobLoggerOptions, as shown in the following example:

public static void Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();

    var todoRepository = host.Services.GetRequiredService<ITodoRepository>();
    todoRepository.Add(new Core.Model.TodoItem() { Name = "Feed the dog" });
    todoRepository.Add(new Core.Model.TodoItem() { Name = "Walk the dog" });

    var logger = host.Services.GetRequiredService<ILogger<Program>>();
    logger.LogInformation("Seeded the database.");

    host.Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logging => logging.AddAzureWebAppDiagnostics())
            .ConfigureServices(serviceCollection => serviceCollection
                .Configure<AzureFileLoggerOptions>(options =>
                {
                    options.FileName = "azure-diagnostics-";
                    options.FileSizeLimit = 50 * 1024;
                    options.RetainedFileCountLimit = 5;
                }).Configure<AzureBlobLoggerOptions>(options =>
                {
                    options.BlobName = "log.txt";
                })
            )
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

Aby skonfigurować ustawienia dostawcy, użyj AzureFileLoggerOptions i AzureBlobLoggerOptions, jak pokazano w następującym przykładzie:To configure provider settings, use AzureFileLoggerOptions and AzureBlobLoggerOptions, as shown in the following example:

public static void Main(string[] args)
{
    var host = CreateWebHostBuilder(args).Build();

    var todoRepository = host.Services.GetRequiredService<ITodoRepository>();
    todoRepository.Add(new Core.Model.TodoItem() { Name = "Feed the dog" });
    todoRepository.Add(new Core.Model.TodoItem() { Name = "Walk the dog" });

    var logger = host.Services.GetRequiredService<ILogger<Program>>();
    logger.LogInformation("Seeded the database.");

    host.Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureLogging(logging => logging.AddAzureWebAppDiagnostics())
        .ConfigureServices(serviceCollection => serviceCollection
                .Configure<AzureFileLoggerOptions>(options =>
                {
                    options.FileName = "azure-diagnostics-";
                    options.FileSizeLimit = 50 * 1024;
                    options.RetainedFileCountLimit = 5;
                }).Configure<AzureBlobLoggerOptions>(options =>
                {
                    options.BlobName = "log.txt";
                }))
        .UseStartup<Startup>();

AddAzureWebAppDiagnostics Przeciążenie umożliwia AzureAppServicesDiagnosticsSettingsprzekazywanie.An AddAzureWebAppDiagnostics overload lets you pass in AzureAppServicesDiagnosticsSettings. Obiekt Settings może przesłonić ustawienia domyślne, takie jak szablon danych wyjściowych rejestrowania, nazwa obiektu BLOB i limit rozmiaru pliku.The settings object can override default settings, such as the logging output template, blob name, and file size limit. (Szablon danych wyjściowych to szablon wiadomości, który jest stosowany do wszystkich dzienników oprócz tego, co jest dostępne ILogger w wywołaniu metody).(Output template is a message template that's applied to all logs in addition to what's provided with an ILogger method call.)

Po wdrożeniu w aplikacji App Service, aplikacja będzie przestrzegać ustawień w sekcji dzienniki App Service na stronie App Service Azure Portal.When you deploy to an App Service app, the application honors the settings in the App Service logs section of the App Service page of the Azure portal. Po zaktualizowaniu następujących ustawień zmiany zaczynają obowiązywać natychmiast, bez konieczności ponownego uruchomienia lub ponownej wdrożenia aplikacji.When the following settings are updated, the changes take effect immediately without requiring a restart or redeployment of the app.

  • Rejestrowanie aplikacji (system plików)Application Logging (Filesystem)
  • Rejestrowanie aplikacji (BLOB)Application Logging (Blob)

Domyślną lokalizacją plików dziennika jest folder D\:\Home\LogFiles , a domyślna nazwa pliku to Diagnostics-YYYYMMDD. txt.The default location for log files is in the D:\home\LogFiles\Application folder, and the default file name is diagnostics-yyyymmdd.txt. Domyślny limit rozmiaru pliku wynosi 10 MB, a domyślna maksymalna liczba zachowywanych plików to 2.The default file size limit is 10 MB, and the default maximum number of files retained is 2. Domyślną nazwą obiektu BLOB jest {App-Name} {timestamp}/yyyy/mm/dd/hh/{GUID}-applicationLog.txt.The default blob name is {app-name}{timestamp}/yyyy/mm/dd/hh/{guid}-applicationLog.txt.

Dostawca działa tylko wtedy, gdy projekt jest uruchomiony w środowisku platformy Azure.The provider only works when the project runs in the Azure environment. Nie ma ono wpływu, gdy projekt jest uruchamiany lokalnie—, nie zapisuje w plikach lokalnych ani w lokalnym magazynie programistycznym dla obiektów BLOB.It has no effect when the project is run locally—it doesn't write to local files or local development storage for blobs.

Przesyłanie strumieniowe dzienników AzureAzure log streaming

Usługa przesyłania strumieniowego w usłudze Azure log umożliwia wyświetlanie dziennika aktywności w czasie rzeczywistym z:Azure log streaming lets you view log activity in real time from:

  • Serwer aplikacjiThe app server
  • Serwer sieci WebThe web server
  • Śledzenie nieudanych żądańFailed request tracing

Aby skonfigurować przesyłanie strumieniowe dzienników Azure:To configure Azure log streaming:

  • Przejdź do strony dzienników App Service ze strony portalu aplikacji.Navigate to the App Service logs page from your app's portal page.
  • Ustaw Rejestrowanie aplikacji (system plików) na włączone.Set Application Logging (Filesystem) to On.
  • Wybierz poziomdziennika.Choose the log Level.

Przejdź do strony strumień dziennika , aby wyświetlić komunikaty aplikacji.Navigate to the Log Stream page to view app messages. Są one rejestrowane przez aplikację za pomocą ILogger interfejsu.They're logged by the app through the ILogger interface.

Rejestrowanie śledzenia Application Insights platformy AzureAzure Application Insights trace logging

Pakiet Microsoft. Extensions. Logging. ApplicationInsights Provider zapisuje dzienniki na platformie Azure Application Insights.The Microsoft.Extensions.Logging.ApplicationInsights provider package writes logs to Azure Application Insights. Application Insights to usługa, która monitoruje aplikację internetową i udostępnia narzędzia do wykonywania zapytań i analizowania danych telemetrycznych.Application Insights is a service that monitors a web app and provides tools for querying and analyzing the telemetry data. Jeśli używasz tego dostawcy, możesz wysyłać zapytania i analizować dzienniki przy użyciu narzędzi Application Insights.If you use this provider, you can query and analyze your logs by using the Application Insights tools.

Dostawca rejestrowania jest dołączony jako zależność Microsoft. ApplicationInsights. AspNetCore, który jest pakietem, który zapewnia wszystkie dostępne dane telemetryczne dla ASP.NET Core.The logging provider is included as a dependency of Microsoft.ApplicationInsights.AspNetCore, which is the package that provides all available telemetry for ASP.NET Core. Jeśli używasz tego pakietu, nie musisz instalować pakietu dostawcy.If you use this package, you don't have to install the provider package.

Nie używaj—pakietu Microsoft. ApplicationInsights. Web , który jest przeznaczony dla ASP.NET 4. x.Don't use the Microsoft.ApplicationInsights.Web package—that's for ASP.NET 4.x.

Aby uzyskać więcej informacji, zobacz następujące zasoby:For more information, see the following resources:

Dostawcy rejestrowania innych firmThird-party logging providers

Platformy rejestrowania innych firm, które współpracują z ASP.NET Core:Third-party logging frameworks that work with ASP.NET Core:

Niektóre struktury innych firm mogą wykonywać Rejestrowanie semantyczne, znane także jako rejestrowanie strukturalne.Some third-party frameworks can perform semantic logging, also known as structured logging.

Korzystanie z struktury innej firmy jest podobne do korzystania z jednego z wbudowanych dostawców:Using a third-party framework is similar to using one of the built-in providers:

  1. Dodaj pakiet NuGet do projektu.Add a NuGet package to your project.
  2. Wywołaj ILoggerFactorymetodę.Call an ILoggerFactory.

Aby uzyskać więcej informacji, zobacz dokumentację każdego dostawcy.For more information, see each provider's documentation. Dostawcy rejestrowania innych firm nie są obsługiwani przez firmę Microsoft.Third-party logging providers aren't supported by Microsoft.

Dodatkowe zasobyAdditional resources