ASP.NET Core에 로그인Logging in ASP.NET Core

작성자: Steve SmithTom DykstraBy Steve Smith and Tom Dykstra

ASP.NET Core는 다양한 기본 제공 및 타사 로깅 공급자와 함께 작동하는 로깅 API를 지원합니다.ASP.NET Core supports a logging API that works with a variety of built-in and third-party logging providers. 이 문서에서는 기본 제공 공급자에서 로깅 API를 사용하는 방법을 보여줍니다.This article shows how to use the logging API with built-in providers.

예제 코드 살펴보기 및 다운로드(다운로드 방법)View or download sample code (how to download)

공급자 추가Add providers

로깅 공급자는 로그를 표시하거나 저장합니다.A logging provider displays or stores logs. 예를 들어 콘솔 공급자는 콘솔에 로그를 표시하고 Azure Application Insights 공급자는 이를 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. 여러 공급자를 추가하여 로그를 여러 대상으로 보낼 수 있습니다.Logs can be sent to multiple destinations by adding multiple providers.

공급자를 추가하려면 Program.cs에서 공급자의 Add{provider name} 확장 메서드를 호출합니다.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) =>
        {
            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
            logging.AddDebug();
            logging.AddEventSourceLogger();
        })
        .UseStartup<Startup>()
        .Build();

    webHost.Run();
}

기본 프로젝트 템플릿은 CreateDefaultBuilder 확장 메서드를 호출하여 다음 로깅 공급자를 추가합니다.The default project template calls the CreateDefaultBuilder extension method, which adds the following logging providers:

  • 콘솔Console
  • 디버그Debug
  • EventSource(ASP.NET Core 2.2에서 시작)EventSource (starting in ASP.NET Core 2.2)
public static void Main(string[] args)
{
    BuildWebHost(args).Run();
}

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

CreateDefaultBuilder를 사용하는 경우 기본 제공자를 사용자가 선택한 대로 바꿀 수 있습니다.If you use CreateDefaultBuilder, you can replace the default providers with your own choices. ClearProviders를 호출하여 원하는 공급자를 추가합니다.Call ClearProviders, and add the providers you want.

public static void Main(string[] args)
{
    var host = BuildWebHost(args);

    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 IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.AddConsole();
        })
        .Build();

공급자를 사용하려면 해당 NuGet 패키지를 설치하고 ILoggerFactory 인스턴스에서 공급자의 확장 메서드를 호출합니다.To use a provider, install its NuGet package and call the provider's extension method on an instance of ILoggerFactory:

public void Configure(IApplicationBuilder app,
    IHostingEnvironment env,
    ILoggerFactory loggerFactory)
{
    loggerFactory
        .AddConsole()
        .AddDebug();

ASP.NET Core DI(종속성 주입)는 ILoggerFactory 인스턴스를 제공합니다.ASP.NET Core dependency injection (DI) provides the ILoggerFactory instance. AddConsoleAddDebug 확장 메서드는 Microsoft.Extensions.Logging.ConsoleMicrosoft.Extensions.Logging.Debug 패키지에 정의됩니다.The AddConsole and AddDebug extension methods are defined in the Microsoft.Extensions.Logging.Console and Microsoft.Extensions.Logging.Debug packages. 각 확장 메서드는 ILoggerFactory.AddProvider 메서드를 호출하고, 공급자 인스턴스를 전달합니다.Each extension method calls the ILoggerFactory.AddProvider method, passing in an instance of the provider.

참고

샘플 앱Startup.Configure 메서드에서 로그 공급자를 추가합니다.The sample app adds logging providers in the Startup.Configure method. 먼저 실행되는 코드의 로그 출력을 가져오려면 Startup 클래스 생성자에 로그 공급자를 추가합니다.To obtain log output from code that executes earlier, add logging providers in the Startup class constructor.

문서의 뒷부분에 나오는 기본 제공 로깅 공급자타사 로깅 공급자에 대해 자세히 알아봅니다.Learn more about built-in logging providers and third-party logging providers later in the article.

로그 만들기Create logs

DI에서 ILogger<TCategoryName> 개체를 가져옵니다.Get an ILogger<TCategoryName> object from DI.

다음 컨트롤러 예제에서는 InformationWarning 로그를 만듭니다.The following controller example creates Information and Warning logs. 범주TodoApiSample.Controllers.TodoController(샘플 앱에서 TodoController의 정규화된 클래스 이름 샘플)입니다.The category is TodoApiSample.Controllers.TodoController (the fully qualified class name of TodoController in the sample app):

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

    public TodoController(ITodoRepository todoRepository,
        ILogger<TodoController> logger)
    {
        _todoRepository = todoRepository;
        _logger = logger;
    }
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);
}

다음 Razor Pages 예제에서는 Information수준으로, TodoApiSample.Pages.AboutModel범주로 사용하는 로그를 만듭니다.The following Razor Pages example creates logs with Information as the level and TodoApiSample.Pages.AboutModel as the category:

public class AboutModel : PageModel
{
    private readonly ILogger _logger;

    public AboutModel(ILogger<AboutModel> logger)
    {
        _logger = logger;
    }
public void OnGet()
{
    Message = $"About page visited at {DateTime.UtcNow.ToLongTimeString()}";
    _logger.LogInformation("Message displayed: {Message}", Message);
}
public class TodoController : Controller
{
    private readonly ITodoRepository _todoRepository;
    private readonly ILogger _logger;

    public TodoController(ITodoRepository todoRepository,
        ILogger<TodoController> logger)
    {
        _todoRepository = todoRepository;
        _logger = logger;
    }
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);
}

앞의 예제에서는 InformationWarning수준으로, TodoController 클래스를 범주로 사용하는 로그를 만듭니다.The preceding example creates logs with Information and Warning as the level and TodoController class as the category.

로그 수준은 기록된 이벤트의 심각도를 나타냅니다.The Log level indicates the severity of the logged event. 로그 범주는 각 로그와 연결된 문자열입니다.The log category is a string that is associated with each log. ILogger<T> 인스턴스는 T 형식의 정규화된 이름을 가진 로그를 범주로 만듭니다.The ILogger<T> instance creates logs that have the fully qualified name of type T as the category. 수준범주는 이 문서의 뒷부분에 자세히 설명되어 있습니다.Levels and categories are explained in more detail later in this article.

시작 시 로그 만들기Create logs in Startup

Startup 클래스에 로그를 작성하려면 생성자 시그니처에 ILogger 매개 변수를 포함시킵니다.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();

        // 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();
    }
}

프로그램에 로그 만들기Create logs in Program

Program 클래스에 로그를 작성하려면 DI에서 ILogger 인스턴스를 가져옵니다.To write logs in the Program class, get an ILogger instance from DI:

public static void Main(string[] args)
{
    var host = BuildWebHost(args);

    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 IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.AddConsole();
        })
        .Build();

비동기 로거 메서드 없음No asynchronous logger methods

로깅은 매우 빨라서 비동기 코드의 성능 비용을 들일 필요가 없습니다.Logging should be so fast that it isn't worth the performance cost of asynchronous code. 로깅 데이터 저장소가 느린 경우 직접 작성하지 마세요.If your logging data store is slow, don't write to it directly. 로그 메시지를 처음에 빠른 저장소에 작성한 다음, 나중에 느린 저장소로 이동하는 것이 좋습니다.Consider writing the log messages to a fast store initially, then move them to the slow store later. 예를 들어 다른 프로세스에서 읽고 지속하는 느린 저장소인 메시지 큐에 기록합니다.For example, log to a message queue that's read and persisted to slow storage by another process.

구성Configuration

로깅 공급자 구성은 하나 이상의 구성 공급자에서 제공합니다.Logging provider configuration is provided by one or more configuration providers:

  • 파일 형식(INI, JSON 및 XML).File formats (INI, JSON, and XML).
  • 명령줄 인수.Command-line arguments.
  • 환경 변수.Environment variables.
  • 메모리 내 .NET 개체.In-memory .NET objects.
  • 암호화되지 않은 암호 관리자 저장소.The unencrypted Secret Manager storage.
  • 암호화된 사용자 저장소(예:Azure Key Vault).An encrypted user store, such as Azure Key Vault.
  • 사용자 지정 공급자(설치 또는 생성된).Custom providers (installed or created).

예를 들어 로깅 구성은 일반적으로 앱 설정 파일의 Logging 섹션에서 제공됩니다.For example, logging configuration is commonly provided by the Logging section of app settings files. 다음 예제에서는 일반적인 appsettings.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
    }
  }
}

Logging 속성은 LogLevel 및 로그 공급자 속성을 포함할 수 있습니다(콘솔이 표시됨).The Logging property can have LogLevel and log provider properties (Console is shown).

Logging 아래의 LogLevel 속성은 선택한 범주에 대해 로그할 최소 수준을 지정합니다.The LogLevel property under Logging specifies the minimum level to log for selected categories. 이 예제에서는 SystemMicrosoft 범주는 Information 수준으로 로그되고 다른 모든 범주는 Debug 수준으로 로그됩니다.In the example, System and Microsoft categories log at Information level, and all others log at Debug level.

Logging 아래의 다른 속성은 로깅 공급자를 지정합니다.Other properties under Logging specify logging providers. 이 예제는 콘솔 공급자를 위한 것입니다.The example is for the Console provider. 공급자가 로그 범위를 지원하는 경우 IncludeScopes는 사용 가능 여부를 나타냅니다.If a provider supports log scopes, IncludeScopes indicates whether they're enabled. 공급자 속성(예: 예제에서 Console)은 LogLevel 속성을 지정할 수도 있습니다.A provider property (such as Console in the example) may also specify a LogLevel property. 공급자 아래의 LogLevel은 해당 공급자에 대한 로그 수준을 지정합니다.LogLevel under a provider specifies levels to log for that provider.

수준이 Logging.{providername}.LogLevel에 지정된 경우 Logging.LogLevel에 설정된 모든 수준을 재정의합니다.If levels are specified in Logging.{providername}.LogLevel, they override anything set in Logging.LogLevel.

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

LogLevel 키는 로그 이름을 나타냅니다.LogLevel keys represent log names. Default 키는 명시적으로 나열되지 않은 로그에 적용됩니다.The Default key applies to logs not explicitly listed. 값은 지정된 로그에 적용된 로그 수준을 나타냅니다.The value represents the log level applied to the given log.

구성 공급자 구현에 대한 자세한 내용은 ASP.NET Core의 구성를 참조하세요.For information on implementing configuration providers, see ASP.NET Core의 구성.

샘플 로깅 출력Sample logging output

이전 섹션에 나와 있는 샘플 코드를 사용하면 명령줄에서 앱을 실행할 때 콘솔에 로그가 표시됩니다.With the sample code shown in the preceding section, logs appear in the console when the app is run from the command line. 다음은 콘솔 출력의 예입니다.Here's an example of console output:

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

이전 로그는 http://localhost:5000/api/todo/0의 샘플 앱에 HTTP Get 요청을 하여 생성되었습니다.The preceding logs were generated by making an HTTP Get request to the sample app at http://localhost:5000/api/todo/0.

다음은 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.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

이전 섹션에 표시된 ILogger 호출을 통해 생성된 로그는 "TodoApi.Controllers.TodoController"로 시작합니다.The logs that are created by the ILogger calls shown in the preceding section begin with "TodoApi.Controllers.TodoController". "Microsoft" 범주로 시작하는 로그는 ASP.NET Core 프레임워크 코드에서 온 것입니다.The logs that begin with "Microsoft" categories are from ASP.NET Core framework code. ASP.NET Core 및 응용 프로그램 코드는 동일한 로깅 API와 공급자를 사용합니다.ASP.NET Core and application code are using the same logging API and providers.

이 문서의 나머지 부분에서는 로깅에 대한 일부 세부 정보 및 옵션을 설명합니다.The remainder of this article explains some details and options for logging.

NuGet 패키지NuGet packages

ILoggerILoggerFactory 인터페이스는 Microsoft.Extensions.Logging.Abstractions에 있으며, 두 인터페이스의 기본 구현은 Microsoft.Extensions.Logging에 있습니다.The ILogger and ILoggerFactory interfaces are in Microsoft.Extensions.Logging.Abstractions, and default implementations for them are in Microsoft.Extensions.Logging.

로그 범주Log category

ILogger 개체가 생성되면 개체에 대한 범주가 지정됩니다.When an ILogger object is created, a category is specified for it. 해당 범주는 Ilogger의 해당 인스턴스에서 만든 각 로그 메시지에 포함됩니다.That category is included with each log message created by that instance of Ilogger. 범주는 문자열일 수 있지만 "TodoApi.Controllers.TodoController"와 같은 클래스 이름을 사용하는 것이 규칙입니다.The category may be any string, but the convention is to use the class name, such as "TodoApi.Controllers.TodoController".

ILogger<T>를 사용하여 T의 정규화된 형식 이름을 범주로 사용하는 ILogger 인스턴스를 가져옵니다.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;
    }

범주를 명시적으로 지정하려면 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>T의 정규화된 형식 이름으로 CreateLogger를 호출하는 것과 동일합니다.ILogger<T> is equivalent to calling CreateLogger with the fully qualified type name of T.

로그 수준Log level

모든 로그는 LogLevel 값을 지정합니다.Every log specifies a LogLevel value. 로그 수준은 심각도 또는 중요도를 나타냅니다.The log level indicates the severity or importance. 예를 들어 메서드가 정상적으로 종료되면 Information 로그를 작성하고 메서드가 404 찾을 수 없음 상태 코드를 반환할 때 Warning 로그를 작성할 수 있습니다.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.

다음 코드에서는 InformationWarning 코드를 만듭니다.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);
}

이전 코드에서 첫 번째 매개 변수는 로그 이벤트 ID입니다.In the preceding code, the first parameter is the Log event ID. 두 번째 매개 변수는 나머지 메서드 매개 변수가 제공하는 인수 값에 대한 자리 표시자가 있는 메시지 템플릿입니다.The second parameter is a message template with placeholders for argument values provided by the remaining method parameters. 메서드 매개 변수는 이 문서의 뒷부분에 있는 메시지 템플릿 섹션에 설명되어 있습니다.The method parameters are explained in the message template section later in this article.

메서드 이름(예: LogInformationLogWarning)의 수준을 포함하는 로그 메서드는 ILogger에 대한 확장 메서드입니다.Log methods that include the level in the method name (for example, LogInformation and LogWarning) are extension methods for ILogger. 이러한 메서드는 LogLevel 매개 변수를 사용하는 Log 메서드를 호출합니다.These methods call a Log method that takes a LogLevel parameter. 이러한 확장 메서드 중 하나를 호출하는 대신 Log 메서드를 직접 호출할 수 있지만, 구문이 비교적 복잡합니다.You can call the Log method directly rather than one of these extension methods, but the syntax is relatively complicated. 자세한 내용은 ILogger로거 확장 소스 코드를 참조하세요.For more information, see ILogger and the logger extensions source code.

ASP.NET Core는 다음 로그 수준을 정의하며, 여기에 가장 낮은 심각도에서 가장 높은 심각도 순으로 정렬됩니다.ASP.NET Core defines the following log levels, ordered here from lowest to highest severity.

  • 추적 = 0Trace = 0

    일반적으로 디버깅에만 유용한 정보입니다.For information that's typically valuable only for debugging. 이러한 메시지는 중요한 응용 프로그램 데이터를 포함할 수 있으므로 프로덕션 환경에서 사용하면 안 됩니다.These messages may contain sensitive application data and so shouldn't be enabled in a production environment. 기본적으로 사용하지 않도록 설정됩니다.Disabled by default.

  • 디버그 = 1Debug = 1

    개발 및 디버깅에 유용할 수 있는 정보입니다.For information that may be useful in development and debugging. 예: Entering method Configure with flag set to true. 로그 볼륨이 크기 때문에 문제 해결 시에만 Debug 수준 로그를 프로덕션 환경에서 사용합니다.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.

  • 정보 = 2Information = 2

    앱의 일반적인 흐름을 추적합니다.For tracking the general flow of the app. 이러한 로그는 일반적으로 장기적인 가치가 있습니다.These logs typically have some long-term value. 예: Request received for path /api/todoExample: Request received for path /api/todo

  • 경고 = 3Warning = 3

    앱 흐름에 비정상적이거나 예기치 않은 이벤트가 있습니다.For abnormal or unexpected events in the app flow. 앱이 중지되지 않지만 조사해야 하는 오류 또는 기타 조건이 여기에 포함될 수 있습니다.These may include errors or other conditions that don't cause the app to stop but might need to be investigated. 처리된 예외는 Warning 로그 수준을 사용하는 일반적인 장소입니다.Handled exceptions are a common place to use the Warning log level. 예: FileNotFoundException for file quotes.txt.Example: FileNotFoundException for file quotes.txt.

  • 오류 = 4Error = 4

    처리할 수 없는 오류 및 예외입니다.For errors and exceptions that cannot be handled. 이러한 메시지는 전체 앱 오류가 아닌 현재 동작 또는 작업(예: 현재 HTTP 요청)의 오류를 의미합니다.These messages indicate a failure in the current activity or operation (such as the current HTTP request), not an app-wide failure. 예제 로그 메시지: Cannot insert record due to duplicate key violation.Example log message: Cannot insert record due to duplicate key violation.

  • 중요 = 5Critical = 5

    즉각적인 대응이 필요한 오류입니다.For failures that require immediate attention. 예: 데이터 손실 시나리오, 디스크 공간 부족.Examples: data loss scenarios, out of disk space.

로그 수준을 사용하여 특정 저장 매체 또는 디스플레이 창에 기록되는 로그 출력의 양을 제어합니다.Use the log level to control how much log output is written to a particular storage medium or display window. 예:For example:

  • 프로덕션 환경에서 Trace ~ Information 수준을 볼륨 데이터 저장소로 보냅니다.In production, send Trace through Information level to a volume data store. 값 데이터 저장소에 Warning ~ Critical을 보냅니다.Send Warning through Critical to a value data store.
  • 개발 중에 Warning ~ Critical을 콘솔에 보내고 문제 해결 시 Trace ~ Information을 추가합니다.During development, send Warning through Critical to the console, and add Trace through Information when troubleshooting.

이 문서의 뒷부분에 나오는 로그 필터링 섹션에서는 공급자가 처리하는 로그 수준을 제어하는 방법을 설명합니다.The Log filtering section later in this article explains how to control which log levels a provider handles.

ASP.NET Core는 프레임워크 이벤트에 대한 로그를 작성합니다.ASP.NET Core writes logs for framework events. 이 문서 앞부분에 나온 로그 예제는 Information 수준 미만 로그를 제외했기 때문에 Debug 또는 Trace 수준 로그가 생성되지 않습니다.The log examples earlier in this article excluded logs below Information level, so no Debug or Trace level logs were created. 다음은 Debug 로그를 표시하도록 구성된 샘플 앱을 실행하여 생성된 콘솔 로그의 예입니다.Here's an example of console logs produced by running the sample app configured to show Debug logs:

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

로그 이벤트 IDLog event ID

각 로그는 이벤트 ID를 지정할 수 있습니다.Each log can specify an event ID. 샘플 앱은 로컬로 정의된 LoggingEvents 클래스를 사용하여 이 작업을 수행합니다.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;
}

이벤트 ID는 이벤트 집합을 연결합니다.An event ID associates a set of events. 예를 들어 페이지에서 항목 목록을 표시하는 것과 관련된 모든 로그는 1001일 수 있습니다.For example, all logs related to displaying a list of items on a page might be 1001.

로깅 공급자는 이벤트 ID를 ID 필드, 로그 메시지에 저장하거나 전혀 저장할 수 없습니다.The logging provider may store the event ID in an ID field, in the logging message, or not at all. 디버그 공급자는 이벤트 ID를 표시하지 않습니다.The Debug provider doesn't show event IDs. 콘솔 공급자는 범주 뒤에 대괄호로 이벤트 ID를 표시합니다.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

로그 메시지 템플릿Log message template

각 로그는 메시지 템플릿을 지정합니다.Each log specifies a message template. 메시지 템플릿에는 인수가 제공되는 자리 표시자를 포함할 수 있습니다.The message template can contain placeholders for which arguments are provided. 숫자가 아니라 자리 표시자의 이름을 사용합니다.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);
}

값을 제공하는 데 사용되는 매개 변수를 결정하는 것은 자리 표시자의 번호가 아닌 이름입니다.The order of placeholders, not their names, determines which parameters are used to provide their values. 다음 코드에서는 매개 변수 이름이 메시지 템플릿 순서를 벗어났습니다.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);

이 코드는 매개 변수 값을 순서대로 사용하여 로그 메시지를 만듭니다.This code creates a log message with the parameter values in sequence:

Parameter values: parm1, parm2

로깅 프레임워크는 로깅 공급자가 구조화된 로깅이라고도 하는 의미 체계 로깅을 구현할 수 있도록 이 방식으로 작동합니다.The logging framework works this way so that logging providers can implement semantic logging, also known as structured logging. 인수 자체는 서식이 지정된 메시지 템플릿뿐만 아니라 로깅 시스템에 전달됩니다.The arguments themselves are passed to the logging system, not just the formatted message template. 이 정보를 통해 로깅 공급자는 매개 변수 값을 필드로 저장할 수 있습니다.This information enables logging providers to store the parameter values as fields. 예를 들어 로거 메서드 호출이 다음과 같다고 가정합니다.For example, suppose logger method calls look like this:

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

Azure Table Storage에 로그를 보내는 경우 각 Azure Table 엔터티는 로그 데이터에 대한 쿼리를 간소화하는 IDRequestTime 속성을 가질 수 있습니다.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. 쿼리는 문자 메시지의 시간 초과를 구문 분석하지 않고 특정 RequestTime 범위 내의 모든 로그를 찾을 수 있습니다.A query can find all logs within a particular RequestTime range without parsing the time out of the text message.

로깅 처리Logging exceptions

로거 메서드는 다음 예제와 같이 예외를 전달할 수 있는 오버로드를 갖고 있습니다.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);

공급자들은 다양한 방식으로 예외 정보를 처리합니다.Different providers handle the exception information in different ways. 다음은 위에서 보여드린 코드의 디버그 공급자 출력의 예제입니다.Here's an example of Debug provider output from the code shown above.

TodoApi.Controllers.TodoController:Warning: GetById(036dd898-fb01-47e8-9a65-f92eb73cf924) NOT FOUND

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

로깅 필터링Log filtering

특정 공급자 및 범주 또는 모든 공급자나 모든 범주의 최소 로그 수준을 지정할 수 있습니다.You can specify a minimum log level for a specific provider and category or for all providers or all categories. 최소 수준 미만인 로그는 해당 공급자에게 전달되지 않으므로 표시되거나 저장되지 않습니다.Any logs below the minimum level aren't passed to that provider, so they don't get displayed or stored.

모든 로그를 표시하지 않으려면 LogLevel.None을 최소 로그 수준으로 지정합니다.To suppress all logs, specify LogLevel.None as the minimum log level. LogLevel.None의 정수 값은 LogLevel.Critical(5)보다 높은 6입니다.The integer value of LogLevel.None is 6, which is higher than LogLevel.Critical (5).

구성에서 필터 규칙 만들기Create filter rules in configuration

프로젝트 템플릿 코드는 CreateDefaultBuilder를 호출하여 콘솔 및 디버그 공급자에 대한 로깅을 설정합니다.The project template code calls CreateDefaultBuilder to set up logging for the Console and Debug providers. 또한 CreateDefaultBuilder 메서드는 다음과 같은 코드를 사용하여 Logging 섹션에서 구성을 조회하는 로깅을 설정합니다.The CreateDefaultBuilder method also sets up logging to look for configuration in a Logging section, using code like the following:

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) =>
        {
            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
            logging.AddDebug();
            logging.AddEventSourceLogger();
        })
        .UseStartup<Startup>()
        .Build();

    webHost.Run();
}

구성 데이터는 다음 예제와 같이 공급자 및 범주별로 최소 로그 수준을 지정합니다.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"
    }
  }
}

이 JSON은 6개의 필터 규칙을 만드는데, 하나는 디버그 공급자용이고, 4개는 콘솔 공급자용이고, 나머지 하나는 모든 공급자용입니다.This JSON creates six filter rules: one for the Debug provider, four for the Console provider, and one for all providers. ILogger 개체가 생성될 때 각 공급자에 대해 단일 규칙이 선택됩니다.A single rule is chosen for each provider when an ILogger object is created.

코드의 필터 규칙Filter rules in code

다음 예제에서는 코드에 필터 규칙을 등록하는 방법을 보여줍니다.The following example shows how to register filter rules in code:

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

두 번째 AddFilter는 형식 이름을 사용하여 디버그 공급자를 지정합니다.The second AddFilter specifies the Debug provider by using its type name. 첫 번째 AddFilter는 공급자 형식을 지정하지 않으며, 따라서 모든 공급자에 적용됩니다.The first AddFilter applies to all providers because it doesn't specify a provider type.

필터링 규칙 적용 방식How filtering rules are applied

이전 예제의 구성 데이터 및 AddFilter 코드는 다음 표에 표시된 규칙을 만듭니다.The configuration data and the AddFilter code shown in the preceding examples create the rules shown in the following table. 처음 6개는 구성 예제에서 가져온 것이고 마지막 2개는 코드 예제에서 가져온 것입니다.The first six come from the configuration example and the last two come from the code example.

Number 공급자Provider 다음으로 시작하는 범주...Categories that begin with ... 최소 로그 수준Minimum log level
11 디버그Debug 모든 범주All categories 정보Information
22 콘솔Console Microsoft.AspNetCore.Mvc.Razor.InternalMicrosoft.AspNetCore.Mvc.Razor.Internal 경고Warning
33 콘솔Console Microsoft.AspNetCore.Mvc.Razor.RazorMicrosoft.AspNetCore.Mvc.Razor.Razor 디버그Debug
44 콘솔Console Microsoft.AspNetCore.Mvc.RazorMicrosoft.AspNetCore.Mvc.Razor ErrorError
55 콘솔Console 모든 범주All categories 정보Information
66 모든 공급자All providers 모든 범주All categories 디버그Debug
77 모든 공급자All providers 시스템System 디버그Debug
88 디버그Debug MicrosoftMicrosoft 추적Trace

ILogger 개체를 만들 때 ILoggerFactory 개체는 공급자마다 해당 로거에 적용할 단일 규칙을 선택합니다.When an ILogger object is created, the ILoggerFactory object selects a single rule per provider to apply to that logger. ILogger 인스턴스에서 작성된 모든 메시지는 선택한 규칙에 따라 필터링됩니다.All messages written by an ILogger instance are filtered based on the selected rules. 사용 가능한 규칙 중에서 각 공급자 및 범주 쌍에 적용 가능한 가장 구체적인 규칙이 선택됩니다.The most specific rule possible for each provider and category pair is selected from the available rules.

지정된 범주에 대한 ILogger가 생성되면 다음 알고리즘이 각 공급자에 사용됩니다.The following algorithm is used for each provider when an ILogger is created for a given category:

  • 공급자 또는 공급자의 별칭과 일치하는 모든 규칙을 선택합니다.Select all rules that match the provider or its alias. 일치하는 규칙이 없는 경우 빈 공급자가 있는 모든 규칙을 선택합니다.If no match is found, select all rules with an empty provider.
  • 앞 단계의 결과에서 일치하는 범주 접두사가 가장 긴 규칙을 선택합니다.From the result of the preceding step, select rules with longest matching category prefix. 일치하는 규칙이 없는 경우 범주를 지정하지 않는 규칙을 모두 선택합니다.If no match is found, select all rules that don't specify a category.
  • 여러 규칙을 선택하는 경우 마지막 규칙을 사용합니다.If multiple rules are selected, take the last one.
  • 규칙을 선택하지 않는 경우 MinimumLevel을 사용합니다.If no rules are selected, use MinimumLevel.

앞의 규칙 목록을 통해 "Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine" 범주에 대한 ILogger 개체를 만든다고 가정합니다.With the preceding list of rules, suppose you create an ILogger object for category "Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine":

  • 디버그 공급자에게는 규칙 1, 6, 8이 적용됩니다.For the Debug provider, rules 1, 6, and 8 apply. 규칙 8이 가장 구체적이므로 선택됩니다.Rule 8 is most specific, so that's the one selected.
  • 콘솔 공급자에게는 규칙 3, 4, 5, 6이 적용됩니다.For the Console provider, rules 3, 4, 5, and 6 apply. 규칙 3이 가장 구체적입니다.Rule 3 is most specific.

결과 ILogger 인스턴스는 Trace 수준 이상의 로그를 디버그 공급자에게 보냅니다.The resulting ILogger instance sends logs of Trace level and above to the Debug provider. Debug 수준 이상의 로그가 콘솔 공급자에게 전송됩니다.Logs of Debug level and above are sent to the Console provider.

공급자 별칭Provider aliases

각 공급자는 정규화된 형식 이름 대신 구성에서 사용할 수 있는 별칭을 정의합니다.Each provider defines an alias that can be used in configuration in place of the fully qualified type name. 기본 공급자의 경우 다음 별칭을 사용합니다.For the built-in providers, use the following aliases:

  • 콘솔Console
  • 디버그Debug
  • EventLogEventLog
  • AzureAppServicesAzureAppServices
  • TraceSourceTraceSource
  • EventSourceEventSource

기본 최소 수준Default minimum level

특정 공급자 및 범주에 대한 구성 또는 코드의 규칙이 적용되지 않는 경우에만 효력이 있는 최소 수준 설정이 있습니다.There's a minimum level setting that takes effect only if no rules from configuration or code apply for a given provider and category. 다음 예제는 최소 수준을 설정하는 방법을 보여 줍니다.The following example shows how to set the minimum level:

WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .ConfigureLogging(logging => logging.SetMinimumLevel(LogLevel.Warning))
    .Build();

최소 수준을 명시적으로 설정하지 않으면 TraceDebug 로그를 무시하는 Information이 기본값으로 설정됩니다.If you don't explicitly set the minimum level, the default value is Information, which means that Trace and Debug logs are ignored.

필터 함수Filter functions

필터 함수는 구성 또는 코드를 통해 규칙이 할당되지 않은 모든 공급자와 범주에 대해 호출됩니다.A filter function is invoked for all providers and categories that don't have rules assigned to them by configuration or code. 함수의 코드는 공급자 형식, 범주 및 로그 수준에 액세스할 수 있습니다.Code in the function has access to the provider type, category, and log level. 예:For example:

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;
        });
    })
    .Build();

일부 로깅 공급자는 로그 수준 및 범주에 따라 로그를 저장 매체에 기록할 것인지 아니면 무시할 것인지를 개발자가 지정할 수 있게 해줍니다.Some logging providers let you specify when logs should be written to a storage medium or ignored based on log level and category.

AddConsoleAddDebug 확장 메서드는 필터링 조건을 허용하는 오버로드를 제공합니다.The AddConsole and AddDebug extension methods provide overloads that accept filtering criteria. 다음 샘플 코드는 콘솔 공급자가 Warning 수준 미만의 로그를 무시하게 만들고, 디버그 공급자는 프레임워크에서 만드는 로그를 무시합니다.The following sample code causes the console provider to ignore logs below Warning level, while the Debug provider ignores logs that the framework creates.

public void Configure(IApplicationBuilder app,
    IHostingEnvironment env,
    ILoggerFactory loggerFactory)
{
    loggerFactory
        .AddConsole(LogLevel.Warning)
        .AddDebug((category, logLevel) => (category.Contains("TodoApi") && logLevel >= LogLevel.Trace));

AddEventLog 메서드는 EventLogSettings 인스턴스를 사용하는 오버로드를 갖고 있으며, 이 인스턴스의 Filter 속성에는 필터링 함수가 포함될 수 있습니다.The AddEventLog method has an overload that takes an EventLogSettings instance, which may contain a filtering function in its Filter property. TraceSource 공급자는 오버로드를 제공하지 않습니다. 로깅 수준 및 기타 매개 변수가 사용하는 SourceSwitchTraceListener를 기반으로 하기 때문입니다.The TraceSource provider doesn't provide any of those overloads, since its logging level and other parameters are based on the SourceSwitch and TraceListener it uses.

ILoggerFactory 인스턴스에 등록된 모든 공급자에 대한 필터링 규칙을 설정하려면 WithFilter 확장 방법을 사용합니다.To set filtering rules for all providers that are registered with an ILoggerFactory instance, use the WithFilter extension method. 아래 예제는 앱 코드로 생성된 로그에 대한 디버그 수준에서 로깅하는 동안 프레임워크 로그(범주가 "Microsoft" 또는 "시스템"으로 시작)를 경고로 제한합니다.The example below limits framework logs (category begins with "Microsoft" or "System") to warnings while logging at debug level for logs created by application code.

public void Configure(IApplicationBuilder app,
    IHostingEnvironment env,
    ILoggerFactory loggerFactory)
{
    loggerFactory
        .WithFilter(new FilterLoggerSettings
        {
            { "Microsoft", LogLevel.Warning },
            { "System", LogLevel.Warning },
            { "ToDoApi", LogLevel.Debug }
        })
        .AddConsole()
        .AddDebug();

로그가 기록되지 않도록 하려면 LogLevel.None을 최소 로그 수준으로 지정합니다.To prevent any logs from being written, specify LogLevel.None as the minimum log level. LogLevel.None의 정수 값은 LogLevel.Critical(5)보다 높은 6입니다.The integer value of LogLevel.None is 6, which is higher than LogLevel.Critical (5).

WithFilter 확장 메서드는 Microsoft.Extensions.Logging.Filter NuGet 패키지에서 제공합니다.The WithFilter extension method is provided by the Microsoft.Extensions.Logging.Filter NuGet package. 이 메서드는 등록된 모든 로거 공급자로 전달되는 메시지를 필터링하는 새로운 ILoggerFactory 인스턴스를 반환합니다.The method returns a new ILoggerFactory instance that will filter the log messages passed to all logger providers registered with it. 원래 ILoggerFactory 인스턴스를 포함하여 어떤 ILoggerFactory 인스턴스에도 영향을 주지 않습니다.It doesn't affect any other ILoggerFactory instances, including the original ILoggerFactory instance.

시스템 범주 및 수준System categories and levels

다음은 ASP.NET Core 및 Entity Framework Core에서 사용되는 몇 가지 범주로, 예상되는 로그에 대한 참고 사항입니다.Here are some categories used by ASP.NET Core and Entity Framework Core, with notes about what logs to expect from them:

범주Category 노트Notes
Microsoft.AspNetCoreMicrosoft.AspNetCore 일반 ASP.NET Core 진단.General ASP.NET Core diagnostics.
Microsoft.AspNetCore.DataProtectionMicrosoft.AspNetCore.DataProtection 고려되고, 발견되고, 사용된 키.Which keys were considered, found, and used.
Microsoft.AspNetCore.HostFilteringMicrosoft.AspNetCore.HostFiltering 호스트가 허용됩니다.Hosts allowed.
Microsoft.AspNetCore.HostingMicrosoft.AspNetCore.Hosting HTTP 요청을 완료하는 데 걸린 시간과 시작 시간.How long HTTP requests took to complete and what time they started. 로드된 호스팅 시작 어셈블리.Which hosting startup assemblies were loaded.
Microsoft.AspNetCore.MvcMicrosoft.AspNetCore.Mvc MVC 및 Razor 진단.MVC and Razor diagnostics. 모델 바인딩, 필터 실행, 뷰 컴파일 작업 선택.Model binding, filter execution, view compilation, action selection.
Microsoft.AspNetCore.RoutingMicrosoft.AspNetCore.Routing 경로 일치 정보.Route matching information.
Microsoft.AspNetCore.ServerMicrosoft.AspNetCore.Server 연결 시작, 중지 및 활성 응답 유지.Connection start, stop, and keep alive responses. HTTPS 인증서 정보.HTTPS certificate information.
Microsoft.AspNetCore.StaticFilesMicrosoft.AspNetCore.StaticFiles 파일이 제공되었습니다.Files served.
Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore 일반 Entity Framework Core 진단.General Entity Framework Core diagnostics. 데이터베이스 작업 및 구성, 변경 내용 검색, 마이그레이션.Database activity and configuration, change detection, migrations.

로그 점수Log scopes

범위는 논리적 작업 집합을 그룹화할 수 있습니다.A scope can group a set of logical operations. 이 그룹화는 집합의 일부로 생성된 각 로그에 동일한 데이터를 연결하는 데 사용될 수 있습니다.This grouping can be used to attach the same data to each log that's created as part of a set. 예를 들어 트랜잭션 처리의 일부로 생성되는 모든 로그에는 트랜잭션 ID가 포함될 수 있습니다.For example, every log created as part of processing a transaction can include the transaction ID.

범위는 BeginScope 메서드에서 반환하는 IDisposable 형식이며 삭제될 때까지 유지됩니다.A scope is an IDisposable type that's returned by the BeginScope method and lasts until it's disposed. using 블록에 로거 호출을 래핑하여 범위를 사용합니다.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);
}

다음은 콘솔 공급자에 대한 범위를 사용하도록 설정하는 코드입니다.The following code enables scopes for the console provider:

Program.cs:Program.cs:

.ConfigureLogging((hostingContext, logging) =>
{
    logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
    logging.AddConsole(options => options.IncludeScopes = true);
    logging.AddDebug();
})

참고

범위 기반 로깅을 사용하려면 IncludeScopes 콘솔 로거 옵션을 구성해야 합니다.Configuring the IncludeScopes console logger option is required to enable scope-based logging.

구성에 대한 자세한 내용은 구성 섹션을 참조하세요.For information on configuration, see the Configuration section.

Program.cs:Program.cs:

.ConfigureLogging((hostingContext, logging) =>
{
    logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
    logging.AddConsole(options => options.IncludeScopes = true);
    logging.AddDebug();
})

참고

범위 기반 로깅을 사용하려면 IncludeScopes 콘솔 로거 옵션을 구성해야 합니다.Configuring the IncludeScopes console logger option is required to enable scope-based logging.

Startup.cs:Startup.cs:

public void Configure(IApplicationBuilder app,
    IHostingEnvironment env,
    ILoggerFactory loggerFactory)
{
    loggerFactory
        .AddConsole(includeScopes: true)
        .AddDebug();

각 로그 메시지는 범위 정보를 포함하고 있습니다.Each log message includes the scoped information:

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

기본 로깅 공급자Built-in logging providers

ASP.NET Core는 다음 공급자를 제공합니다.ASP.NET Core ships the following providers:

Azure에서 로깅에 대한 옵션은 이 문서의 뒷부분에 나와 있습니다.Options for Logging in Azure are covered later in this article.

stdout 로깅에 대한 자세한 내용은 IIS에서 ASP.NET Core 문제 해결Azure App Service에서 ASP.NET Core 시작 오류 문제 해결을 참조하세요.For information about stdout logging, see IIS에서 ASP.NET Core 문제 해결 and Azure App Service에서 ASP.NET Core 시작 오류 문제 해결.

콘솔 공급자Console provider

Microsoft.Extensions.Logging.Console 공급자 패키지는 콘솔에 로그 출력을 보냅니다.The Microsoft.Extensions.Logging.Console provider package sends log output to the console.

logging.AddConsole();
loggerFactory.AddConsole();

AddConsole 오버로드를 사용하여 최소 로그 수준, 필터 함수 및 범위 지원 여부를 나타내는 부울을 전달할 수 있습니다.AddConsole overloads let you pass in a minimum log level, a filter function, and a boolean that indicates whether scopes are supported. 다른 옵션으로는 IConfiguration 개체를 전달할 수 있으며, 이 개체는 범위 지원 및 로깅 수준을 지정할 수 있습니다.Another option is to pass in an IConfiguration object, which can specify scopes support and logging levels.

콘솔 공급자는 성능에 상당한 영향을 미치며 일반적으로 프로덕션 환경에서 사용하기에 적합하지 않습니다.The console provider has a significant impact on performance and is generally not appropriate for use in production.

Visual Studio에서 새 프로젝트를 만들면 AddConsole 메서드는 다음과 같습니다.When you create a new project in Visual Studio, the AddConsole method looks like this:

loggerFactory.AddConsole(Configuration.GetSection("Logging"));

이 코드는 appSettings.json 파일의 Logging 섹션을 참조합니다.This code refers to the Logging section of the appSettings.json file:

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

로그 필터링 섹션에서 설명했듯이, 제한 프레임워크를 표시한 설정은 경고에 기록되는 한편 앱이 디버그 수준에서 기록하는 것을 허용합니다.The settings shown limit framework logs to warnings while allowing the app to log at debug level, as explained in the Log filtering section. 자세한 내용은 구성을 참고하시기 바랍니다.For more information, see Configuration.

콘솔 로깅 출력을 보려면 프로젝트 폴더에서 명령 프롬프트를 열고 다음 명령을 실행합니다.To see console logging output, open a command prompt in the project folder and run the following command:

dotnet run

디버그 공급자Debug provider

Microsoft.Extensions.Logging.Debug 공급자 패키지는 System.Diagnostics.Debug 클래스(Debug.WriteLine 메서드 호출)를 사용하여 로그 출력을 씁니다.The Microsoft.Extensions.Logging.Debug provider package writes log output by using the System.Diagnostics.Debug class (Debug.WriteLine method calls).

Linux에서 이 공급자는 /var/log/message에 로그를 씁니다.On Linux, this provider writes logs to /var/log/message.

logging.AddDebug();
loggerFactory.AddDebug();

AddDebug 오버로드를 사용하여 최소 수준 로그 또는 필터 함수를 전달할 수 있습니다.AddDebug overloads let you pass in a minimum log level or a filter function.

EventSource 공급자EventSource provider

ASP.NET Core 1.1.0 이상을 대상으로 하는 앱의 경우 Microsoft.Extensions.Logging.EventSource 공급자 패키지가 이벤트 추적을 구현할 수 있습니다.For apps that target ASP.NET Core 1.1.0 or later, the Microsoft.Extensions.Logging.EventSource provider package can implement event tracing. Windows에서는 ETW를 사용합니다.On Windows, it uses ETW. 플랫폼 간 공급자이지만 이벤트를 수집하지 않으며 Linux 또는 macOS용 도구를 표시합니다.The provider is cross-platform, but there are no event collection and display tools yet for Linux or macOS.

logging.AddEventSourceLogger();
loggerFactory.AddEventSourceLogger();

로그를 수집하고 보는 좋은 방법은 PerfView 유틸리티를 사용하는 것입니다.A good way to collect and view logs is to use the PerfView utility. ETW 로그를 보는 다른 도구가 있지만, PerfView는 ASP.NET에서 내보내는 ETW 이벤트를 처리하기에 가장 좋은 환경을 제공합니다.There are other tools for viewing ETW logs, but PerfView provides the best experience for working with the ETW events emitted by ASP.NET.

이 공급자가 기록한 이벤트를 수집하도록 PerfView를 구성하려면 추가 공급자 목록에 *Microsoft-Extensions-Logging 문자열을 추가합니다.To configure PerfView for collecting events logged by this provider, add the string *Microsoft-Extensions-Logging to the Additional Providers list. (문자열의 시작 부분에 별표를 누락하지 마세요.)(Don't miss the asterisk at the start of the string.)

Perfview 추가 공급자

Windows EventLog 공급자Windows EventLog provider

Microsoft.Extensions.Logging.EventLog 공급자 패키지는 Windows 이벤트 로그에 로그 출력을 보냅니다.The Microsoft.Extensions.Logging.EventLog provider package sends log output to the Windows Event Log.

logging.AddEventLog();
loggerFactory.AddEventLog();

AddEventLog 오버로드를 사용하여 EventLogSettings 또는 최소 로그 수준을 전달할 수 있습니다.AddEventLog overloads let you pass in EventLogSettings or a minimum log level.

TraceSource 공급자TraceSource provider

Microsoft.Extensions.Logging.TraceSource 공급자 패키지는 TraceSource 라이브러리 및 공급자를 사용합니다.The Microsoft.Extensions.Logging.TraceSource provider package uses the TraceSource libraries and providers.

logging.AddTraceSource(sourceSwitchName);
loggerFactory.AddTraceSource(sourceSwitchName);

AddTraceSource 오버로드를 사용하여 원본 스위치 및 추적 수신기를 전달할 수 있습니다.AddTraceSource overloads let you pass in a source switch and a trace listener.

이 공급자를 사용하려면 앱이 .NET Framework(.NET Core가 아닌)에서 실행되어야 합니다.To use this provider, an app has to run on the .NET Framework (rather than .NET Core). 공급자는 샘플 앱에 사용된 TextWriterTraceListener와 같은 다양한 수신기로 메시지를 라우팅할 수 있습니다.The provider can route messages to a variety of listeners, such as the TextWriterTraceListener used in the sample app.

다음은 Warning 이상 메시지를 콘솔 창에 기록하는 TraceSource 공급자를 구성하는 예제입니다.The following example configures a TraceSource provider that logs Warning and higher messages to the console window.

public void Configure(IApplicationBuilder app,
    IHostingEnvironment env,
    ILoggerFactory loggerFactory)
{
    loggerFactory
        .AddDebug();

    // add Trace Source logging
    var testSwitch = new SourceSwitch("sourceSwitch", "Logging Sample");
    testSwitch.Level = SourceLevels.Warning;
    loggerFactory.AddTraceSource(testSwitch,
        new TextWriterTraceListener(writer: Console.Out));

Azure에서 로깅Logging in Azure

Azure에서 로깅에 대한 자세한 내용은 다음 섹션을 참조하세요.For information about logging in Azure, see the following sections:

Azure App Service 공급자Azure App Service provider

Microsoft.Extensions.Logging.AzureAppServices 공급자 패키지는 Azure App Service 앱의 파일 시스템과 Azure Storage 계정의 BLOB 저장소에 텍스트 파일을 기록합니다.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. 공급자 패키지는 .NET Core 1.1 이상을 대상으로 하는 앱에 사용할 수 있습니다.The provider package is available for apps targeting .NET Core 1.1 or later.

.NET Core를 대상으로 하는 경우 다음 사항에 유의합니다.If targeting .NET Core, note the following points:

  • 명시적으로 AddAzureWebAppDiagnostics를 호출하지 마세요.Don't explicitly call AddAzureWebAppDiagnostics. Azure App Service에 앱을 배포하면 공급자가 자동으로 앱에 제공됩니다.The provider is automatically made available to the app when the app is deployed to Azure App Service.

.NET Framework를 대상으로 지정하거나 Microsoft.AspNetCore.App 메타패키지를 참조하는 경우 패키지 공급자를 프로젝트에 추가합니다.If targeting .NET Framework or referencing the Microsoft.AspNetCore.App metapackage, add the provider package to the project. ILoggerFactory 인스턴스에서 AddAzureWebAppDiagnostics 호출:Invoke AddAzureWebAppDiagnostics on an ILoggerFactory instance:

logging.AddAzureWebAppDiagnostics();
loggerFactory.AddAzureWebAppDiagnostics();

AddAzureWebAppDiagnostics 오버로드로 AzureAppServicesDiagnosticsSettings를 전달할 수 있습니다.An AddAzureWebAppDiagnostics overload lets you pass in AzureAppServicesDiagnosticsSettings. 설정 개체는 로깅 출력 템플릿, BLOB 이름, 파일 크기 제한과 같은 기본 설정을 재정의할 수 있습니다.The settings object can override default settings, such as the logging output template, blob name, and file size limit. (출력 템플릿ILogger 메서드를 호출과 함께 제공되는 것 이외에 모든 로그에 적용되는 메시지 템플릿입니다.)(Output template is a message template that's applied to all logs in addition to what's provided with an ILogger method call.)

App Service 앱에 배포할 때 응용 프로그램은 Azure Portal App Service 페이지의 진단 로그 섹션에 있는 설정을 따릅니다.When you deploy to an App Service app, the application honors the settings in the Diagnostic Logs section of the App Service page of the Azure portal. 이러한 설정을 업데이트하는 경우 앱을 다시 시작하거나 재배포하지 않아도 변경 내용은 즉시 적용됩니다.When these settings are updated, the changes take effect immediately without requiring a restart or redeployment of the app.

Azure 로깅 설정

로그 파일의 기본 위치는 D:\home\LogFiles\Application 폴더이며, 기본 파일 이름은 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. 기본 파일 크기 제한은 10MB이고, 보존되는 기본 최대 파일 수는 2입니다.The default file size limit is 10 MB, and the default maximum number of files retained is 2. 기본 BLOB 이름은 {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. 기본 동작에 대한 자세한 내용은 AzureAppServicesDiagnosticsSettings를 참조하세요.For more information about default behavior, see AzureAppServicesDiagnosticsSettings.

공급자는 프로젝트가 Azure 환경에서 실행되는 경우에만 작동합니다.The provider only works when the project runs in the Azure environment. 프로젝트를 로컬로 실행하는 경우에는 아무 영향도 없습니다—Blob에 대한 로컬 파일 또는 로컬 개발 저장소에 기록하지 않습니다.It has no effect when the project is run locally—it doesn't write to local files or local development storage for blobs.

Azure 로그 스트리밍Azure log streaming

Azure 로그 스트리밍을 통해 로그 작업을 실시간으로 볼 수 있습니다.Azure log streaming lets you view log activity in real time from:

  • 앱 서버The app server
  • 웹 서버The web server
  • 실패한 요청 추적Failed request tracing

Azure 로그 스트리밍을 구성하려면:To configure Azure log streaming:

  • 앱의 포털 페이지에서 진단 로그 페이지로 이동합니다.Navigate to the Diagnostics Logs page from your app's portal page.
  • 응용 프로그램 로깅(파일 시스템)On으로 설정합니다.Set Application Logging (Filesystem) to On.

Azure Portal 진단 로그 페이지

로그 스트리밍 페이지로 이동하여 앱 메시지를 봅니다.Navigate to the Log Streaming page to view app messages. 앱이 ILogger 인터페이스를 통해 기록한 것입니다.They're logged by the app through the ILogger interface.

Azure Portal 응용 프로그램 로그 스트리밍

Azure Application Insights 추적 로깅Azure Application Insights trace logging

Application Insights SDK는 ASP.NET Core 로깅 인프라에 생성된 로그를 수집하고 보고할 수 있습니다.The Application Insights SDK can collect and report logs generated by the ASP.NET Core logging infrastructure. 자세한 내용은 다음 리소스를 참조하세요.For more information, see the following resources:

타사 로깅 공급자Third-party logging providers

ASP.NET Core와 호환되는 타사 로깅 프레임워크는 다음과 같습니다.Third-party logging frameworks that work with ASP.NET Core:

일부 타사 프레임워크는 구조적 로깅이라고 하는 의미 체계 로깅을 수행할 수 있습니다.Some third-party frameworks can perform semantic logging, also known as structured logging.

타사 프레임워크를 사용하는 방법은 다음과 같이 기본 공급자 중 하나를 사용하는 방법과 비슷합니다.Using a third-party framework is similar to using one of the built-in providers:

  1. 프로젝트에 NuGet 패키지를 추가합니다.Add a NuGet package to your project.
  2. ILoggerFactory를 호출합니다.Call an ILoggerFactory.

자세한 내용은 각 공급자의 설명서를 참조하세요.For more information, see each provider's documentation. 타사 로깅 공급자는 Microsoft에서 지원되지 않습니다.Third-party logging providers aren't supported by Microsoft.

추가 자료Additional resources