Pengelogan di .NET Core dan ASP.NET Core

Oleh Kirk Larkin, Juergen Gutsch, dan Rick Anderson

Artikel ini menjelaskan pengelogan di .NET karena berlaku untuk aplikasi ASP.NET Core. Untuk informasi rinci tentang pengelogan di .NET, lihat Pengelogan di .NET. Untuk informasi lebih lanjut tentang pengelogan di aplikasi Blazor, lihat Pengelogan Blazor ASP.NET Core.

Penyedia pengelogan

Penyedia pengelogan menyimpan log, kecuali penyedia Console, yang menampilkan log. Misalnya, penyedia Azure Application Insights menyimpan log di Azure Application Insights. Beberapa penyedia dapat diaktifkan.

Templat aplikasi web ASP.NET Core default memanggil WebApplication.CreateBuilder, yang menambahkan penyedia pengelogan berikut:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Kode sebelumnya menunjukkan file Program.cs yang dibuat dengan template aplikasi web ASP.NET Core. Beberapa bagian berikutnya menyediakan sampel berdasarkan templat aplikasi web ASP.NET Core.

Kode berikut menimpa set default penyedia pengelogan yang ditambahkan oleh WebApplication.CreateBuilder:

var builder = WebApplication.CreateBuilder(args);
builder.Logging.ClearProviders();
builder.Logging.AddConsole();

builder.Services.AddRazorPages();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Atau, kode pengelogan sebelumnya dapat ditulis sebagai berikut:

var builder = WebApplication.CreateBuilder();
builder.Host.ConfigureLogging(logging =>
{
    logging.ClearProviders();
    logging.AddConsole();
});

Untuk penyedia tambahan, lihat:

Membuat log

Untuk membuat log, gunakan objek ILogger<TCategoryName> dari injeksi dependensi (DI).

Lihat contoh berikut:

  • Membuat pencatat, ILogger<AboutModel>, yang menggunakan kategori log dengan nama yang sepenuhnya memenuhi syarat dari jenis AboutModel. Kategori log adalah string yang terkait dengan setiap log.
  • Memanggil LogInformation untuk mencatat pada tingkat Information. Tingkat log menunjukkan tingkat keparahan peristiwa yang dicatat.
public class AboutModel : PageModel
{
    private readonly ILogger _logger;

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

    public void OnGet()
    {
        _logger.LogInformation("About page visited at {DT}", 
            DateTime.UtcNow.ToLongTimeString());
    }
}

Tingkat dan kategori dijelaskan lebih rinci nanti dalam dokumentasi ini.

Untuk informasi tentang Blazor, lihat Pengelogan Blazor ASP.NET Core.

Mengonfigurasi pengelogan

Konfigurasi pengelogan biasanya disediakan oleh bagian Logging dari file appsettings.{ENVIRONMENT}.json, di mana tempat penampung {ENVIRONMENT} adalah lingkungan. File appsettings.Development.json berikut dibuat oleh template aplikasi web ASP.NET Core:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  }
}

Di JSON sebelumnya:

  • Kategori "Default" dan "Microsoft.AspNetCore" telah ditentukan.
  • Kategori "Microsoft.AspNetCore" berlaku untuk semua kategori yang dimulai dengan "Microsoft.AspNetCore". Misalnya, pengaturan ini berlaku untuk kategori "Microsoft.AspNetCore.Routing.EndpointMiddleware".
  • Kategori "Microsoft.AspNetCore" mencatat pada tingkat log Warning dan yang lebih tinggi.
  • Penyedia log tertentu tidak ditentukan, jadi LogLevel berlaku untuk semua penyedia pengelogan yang diaktifkan kecuali untuk Windows EventLog.

Properti Logging dapat memiliki LogLevel dan properti penyedia log. LogLevel menentukan tingkat minimum yang akan dicatat untuk kategori yang dipilih. Di JSON sebelumnya, tingkat log Information dan Warning ditentukan. LogLevel menunjukkan tingkat keparahan log dan memiliki rentang 0 hingga 6:

Trace = 0, Debug = 1, Information = 2, Warning = 3, Error = 4, Critical = 5, dan None = 6.

Bila LogLevel ditetapkan, pengelogan diaktifkan untuk pesan pada tingkat yang ditentukan dan lebih tinggi. Pada JSON sebelumnya, kategori Default dicatat untuk Information dan yang lebih tinggi. Misalnya, pesan Information, Warning, Error, dan Critical dicatat. Jika tidak ada LogLevel yang ditentukan, pengelogan diatur ke default, yakni tingkat Information. Untuk informasi lebih lanjut, lihat Tingkat log.

Properti penyedia dapat menentukan properti LogLevel. LogLevel di bawah penyedia menentukan tingkat yang perlu dicatat untuk penyedia tersebut, dan menimpa pengaturan log non-penyedia. Pertimbangkan file appsettings.json berikut:

{
  "Logging": {
    "LogLevel": { // All providers, LogLevel applies to all the enabled providers.
      "Default": "Error", // Default logging, Error and higher.
      "Microsoft": "Warning" // All Microsoft* categories, Warning and higher.
    },
    "Debug": { // Debug provider.
      "LogLevel": {
        "Default": "Information", // Overrides preceding LogLevel:Default setting.
        "Microsoft.Hosting": "Trace" // Debug:Microsoft.Hosting category.
      }
    },
    "EventSource": { // EventSource provider
      "LogLevel": {
        "Default": "Warning" // All categories of EventSource provider.
      }
    }
  }
}

Pengaturan di Logging.{PROVIDER NAME}.LogLevel menimpa pengaturan di Logging.LogLevel, di mana tempat penampung {PROVIDER NAME} adalah nama penyedianya. Pada JSON sebelumnya, tingkat log default penyedia Debug diatur ke Information:

Logging:Debug:LogLevel:Default:Information

Pengaturan sebelumnya menetapkan tingkat log Information untuk setiap kategori Logging:Debug: kecuali Microsoft.Hosting. Ketika kategori tertentu dicantumkan, kategori tersebut menimpa kategori default. Pada JSON sebelumnya, "Microsoft.Hosting" dan "Default" kategori Logging:Debug:LogLevel menimpa pengaturan di Logging:LogLevel.

Tingkat log minimum dapat ditentukan untuk salah satu dari:

  • Penyedia tertentu: Misalnya, Logging:EventSource:LogLevel:Default:Information
  • Kategori tertentu: Misalnya, Logging:LogLevel:Microsoft:Warning
  • Semua penyedia dan semua kategori: Logging:LogLevel:Default:Warning

Setiap log di bawah tingkat minimum tidak:

  • Diteruskan ke penyedia.
  • Dicatat atau ditampilkan.

Untuk menyembunyikan semua log, tentukan LogLevel.None. LogLevel.None memiliki nilai 6, yang lebih tinggi dari LogLevel.Critical (5).

Jika penyedia mendukung cakupan log, IncludeScopes menunjukkan apakah cakupan diaktifkan. Untuk informasi lebih lanjut, lihat cakupan log.

File appsettings.json berikut berisi semua penyedia yang diaktifkan secara default:

{
  "Logging": {
    "LogLevel": { // No provider, LogLevel applies to all the enabled providers.
      "Default": "Error",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Warning"
    },
    "Debug": { // Debug provider.
      "LogLevel": {
        "Default": "Information" // Overrides preceding LogLevel:Default setting.
      }
    },
    "Console": {
      "IncludeScopes": true,
      "LogLevel": {
        "Microsoft.AspNetCore.Mvc.Razor.Internal": "Warning",
        "Microsoft.AspNetCore.Mvc.Razor.Razor": "Debug",
        "Microsoft.AspNetCore.Mvc.Razor": "Error",
        "Default": "Information"
      }
    },
    "EventSource": {
      "LogLevel": {
        "Microsoft": "Information"
      }
    },
    "EventLog": {
      "LogLevel": {
        "Microsoft": "Information"
      }
    },
    "AzureAppServicesFile": {
      "IncludeScopes": true,
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "AzureAppServicesBlob": {
      "IncludeScopes": true,
      "LogLevel": {
        "Microsoft": "Information"
      }
    },
    "ApplicationInsights": {
      "LogLevel": {
        "Default": "Information"
      }
    }
  }
}

Dalam sampel sebelumnya:

  • Kategori dan tingkatan bukan nilai yang disarankan. Sampel disediakan untuk menampilkan semua penyedia default.
  • Pengaturan di Logging.{PROVIDER NAME}.LogLevel menimpa pengaturan di Logging.LogLevel, di mana tempat penampung {PROVIDER NAME} adalah nama penyedianya. Misalnya, tingkat di Debug.LogLevel.Default menggantikan tingkat di LogLevel.Default.
  • Setiap alias penyedia default digunakan. Setiap penyedia mendefinisikan alias yang dapat digunakan dalam konfigurasi, yang menggantikan nama jenis yang sepenuhnya memenuhi syarat. Alias penyedia bawaan adalah:
    • Console
    • Debug
    • EventSource
    • EventLog
    • AzureAppServicesFile
    • AzureAppServicesBlob
    • ApplicationInsights

Log di Program.cs

Contoh berikut memanggil Builder.WebApplication.Logger di Program.cs dan mencatat pesan informasi:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Logger.LogInformation("Adding Routes");
app.MapGet("/", () => "Hello World!");
app.Logger.LogInformation("Starting the app");
app.Run();

Contoh berikut memanggil AddConsole di Program.cs dan mencatat titik akhir /Test:

var builder = WebApplication.CreateBuilder(args);

builder.Logging.AddConsole();

var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.MapGet("/Test", async (ILogger<Program> logger, HttpResponse response) =>
{
    logger.LogInformation("Testing logging in Program.cs");
    await response.WriteAsync("Testing");
});

app.Run();

Contoh berikut memanggil AddSimpleConsole di Program.cs, menonaktifkan output warna, dan mencatat titik akhir /Test:

using Microsoft.Extensions.Logging.Console;

var builder = WebApplication.CreateBuilder(args);

builder.Logging.AddSimpleConsole(i => i.ColorBehavior = LoggerColorBehavior.Disabled);

var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.MapGet("/Test", async (ILogger<Program> logger, HttpResponse response) =>
{
    logger.LogInformation("Testing logging in Program.cs");
    await response.WriteAsync("Testing");
});

app.Run();

Tetapkan tingkat log berdasarkan baris perintah, variabel lingkungan, dan konfigurasi lainnya

Tingkat log dapat diatur oleh penyedia konfigurasi mana pun.

Pemisah : tidak berfungsi dengan kunci hierarkis variabel lingkungan di semua platform. __, garis bawah ganda:

  • Didukung oleh semua platform. Misalnya, pemisah : tidak didukung oleh Bash, tetapi __ didukung.
  • Secara otomatis diganti dengan :

berikut memberi perintah:

  • Atur Logging:LogLevel:Microsoft kunci lingkungan ke nilai Information di Windows.
  • Uji pengaturan saat menggunakan aplikasi yang dibuat dengan template aplikasi web ASP.NET Core. Perintah dotnet run harus dijalankan di direktori proyek setelah menggunakan set.
set Logging__LogLevel__Microsoft=Information
dotnet run

Pengaturan lingkungan sebelumnya:

  • Hanya diatur dalam proses yang diluncurkan dari jendela perintah tempatnya diatur.
  • Tidak dibaca oleh browser yang diluncurkan dengan Visual Studio.

Perintah setx berikut juga mengatur kunci dan nilai lingkungan di Windows. Tidak seperti set, pengaturan setx tetap ada. Pengalih /M mengatur variabel di lingkungan sistem. Jika /M tidak digunakan, variabel lingkungan pengguna diatur.

setx Logging__LogLevel__Microsoft Information /M

Pertimbangkan file appsettings.json berikut:

"Logging": {
  "Console": {
    "LogLevel": {
      "Microsoft.Hosting.Lifetime": "Trace"
    }
  }
}

Perintah berikut menetapkan konfigurasi sebelumnya di lingkungan:

setx Logging__Console__LogLevel__Microsoft.Hosting.Lifetime Trace /M

Catatan

Saat mengonfigurasi variabel lingkungan dengan nama yang berisi . (titik) di macOS dan Linux, pertimbangkan "Mengekspor variabel dengan titik (.) di dalamnya" pertanyaan di Stack Exchange dan jawaban yang diterima yang sesuai.

Pada Azure App Service, pilih Pengaturan aplikasi baru di halaman Pengaturan > Konfigurasi. Pengaturan aplikasi Azure App Service:

  • Dienkripsi saat tidak aktif dan ditransmisikan melalui saluran terenkripsi.
  • Diekspos sebagai variabel lingkungan.

Untuk informasi selengkapnya, lihat Azure Apps: Mengambil alih konfigurasi aplikasi menggunakan portal Azure.

Untuk informasi lebih lanjut tentang mengatur nilai konfigurasi ASP.NET Core menggunakan variabel lingkungan, lihat variabel lingkungan. Untuk informasi tentang penggunaan sumber konfigurasi lain, termasuk baris perintah, Azure Key Vault, Azure App Configuration, format file lain, dan lainnya, lihat Konfigurasi di ASP.NET Core.

Bagaimana aturan pemfilteran diterapkan

Saat objek ILogger<TCategoryName> dibuat, objek ILoggerFactory memilih satu aturan per penyedia untuk diterapkan ke pencatat tersebut. Semua pesan yang ditulis oleh instans ILogger difilter berdasarkan aturan yang dipilih. Aturan paling spesifik untuk setiap pasangan penyedia dan kategori dipilih dari aturan yang tersedia.

Algoritma berikut digunakan untuk setiap penyedia saat ILogger dibuat untuk kategori tertentu:

  • Pilih semua aturan yang cocok dengan penyedia atau aliasnya. Jika tidak ditemukan kecocokan, pilih semua aturan dengan penyedia yang kosong.
  • Dari hasil langkah sebelumnya, pilih aturan dengan awalan kategori yang cocok terpanjang. Jika tidak ada kecocokan yang ditemukan, pilih semua aturan yang tidak menentukan kategori.
  • Jika beberapa aturan dipilih, ambil yang terakhir.
  • Jika tidak ada aturan yang dipilih, gunakan MinimumLevel.

Pengelogan output dari eksekusi dotnet dan Visual Studio

Log yang dibuat dengan penyedia pengelogan default ditampilkan:

  • Di Visual Studio
    • Di jendela output Debug saat penelusuran kesalahan.
    • Di jendela Server Web ASP.NET Core.
  • Di jendela konsol saat aplikasi dijalankan dengan dotnet run.

Log yang dimulai dengan kategori "Microsoft" berasal dari kode kerangka kerja ASP.NET Core. ASP.NET Core dan kode aplikasi menggunakan API dan penyedia pengelogan yang sama.

Kategori log

Saat objek ILogger dibuat, kategori ditentukan. Kategori tersebut disertakan dengan setiap pesan log yang dibuat oleh instans ILogger tersebut. String kategori bersifat arbitrer, tetapi konvensinya adalah menggunakan nama kelas yang sepenuhnya memenuhi syarat. Misalnya, dalam pengontrol, namanya mungkin "TodoApi.Controllers.TodoController". Aplikasi web ASP.NET Core menggunakan ILogger<T> untuk secara otomatis mendapatkan instans ILogger yang menggunakan nama jenis T yang sepenuhnya memenuhi syarat sebagai kategori:

public class PrivacyModel : PageModel
{
    private readonly ILogger<PrivacyModel> _logger;

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

    public void OnGet()
    {
        _logger.LogInformation("GET Pages.PrivacyModel called.");
    }
}

Jika kategorisasi lebih lanjut diinginkan, konvensinya adalah menggunakan nama hierarkis dengan menambahkan subkategori ke nama kelas yang sepenuhnya memenuhi syarat, dan secara eksplisit menentukan kategori menggunakan ILoggerFactory.CreateLogger:

public class ContactModel : PageModel
{
    private readonly ILogger _logger;

    public ContactModel(ILoggerFactory logger)
    {
        _logger = logger.CreateLogger("TodoApi.Pages.ContactModel.MyCategory");
    }

    public void OnGet()
    {
        _logger.LogInformation("GET Pages.ContactModel called.");
    }

Pemanggilan CreateLogger dengan nama tetap dapat berguna bila digunakan dalam beberapa metode sehingga peristiwa dapat diatur berdasarkan kategori.

ILogger<T> sama dengan memanggil CreateLogger, dengan nama jenis T yang sepenuhnya memenuhi syarat.

Tingkat log

Tabel berikut mencantumkan nilai LogLevel, metode ekstensi Log{LogLevel} yang praktis, dan penggunaan yang disarankan:

LogLevel Nilai Metode Deskripsi
Trace 0 LogTrace Berisi pesan paling terperinci. Pesan ini mungkin berisi data aplikasi yang sensitif. Pesan-pesan ini dinonaktifkan secara default dan tidak boleh diaktifkan dalam produksi.
Debug 1 LogDebug Untuk penelusuran kesalahan dan pengembangan. Gunakan dengan hati-hati dalam produksi karena volume yang tinggi.
Information 2 LogInformation Melacak alur umum aplikasi. Mungkin memiliki nilai jangka panjang.
Warning 3 LogWarning Untuk peristiwa yang tidak normal atau tidak terduga. Biasanya menyertakan kesalahan atau kondisi yang tidak menyebabkan aplikasi gagal.
Error 4 LogError Untuk kesalahan dan pengecualian yang tidak dapat ditangani. Pesan-pesan ini menunjukkan kegagalan dalam operasi atau permintaan saat ini, bukan kegagalan di seluruh aplikasi.
Critical 5 LogCritical Untuk kegagalan yang membutuhkan perhatian sesegera mungkin. Contoh: skenario kehilangan data, ruang disk yang habis.
None 6 Menentukan bahwa kategori pengelogan tidak boleh menulis pesan.

Pada tabel sebelumnya, LogLevel dicantumkan dari tingkat keparahan terendah hingga tertinggi.

Parameter pertama metode Log, LogLevel, menunjukkan tingkat keparahan log. Alih-alih memanggil Log(LogLevel, ...), sebagian besar pengembang memanggil metode ekstensi Log{LOG LEVEL}, di mana tempat penampung {LOG LEVEL} adalah tingkat log. Misalnya, dua panggilan pengelogan berikut secara fungsional setara dan menghasilkan log yang sama:

[HttpGet]
public IActionResult Test1(int id)
{
    var routeInfo = ControllerContext.ToCtxString(id);

    _logger.Log(LogLevel.Information, MyLogEvents.TestItem, routeInfo);
    _logger.LogInformation(MyLogEvents.TestItem, routeInfo);

    return ControllerContext.MyDisplayRouteInfo();
}

MyLogEvents.TestItem adalah ID peristiwa. MyLogEvents adalah bagian dari sampel aplikasi dan ditampilkan di bagian ID peristiwa log.

MyDisplayRouteInfo dan ToCtxString disediakan oleh paket NuGet Rick.Docs.Samples.RouteInfo. Metode menampilkan informasi rute Controller dan Razor Page.

Kode berikut membuat log Information dan Warning:

[HttpGet("{id}")]
public async Task<ActionResult<TodoItemDTO>> GetTodoItem(long id)
{
    _logger.LogInformation(MyLogEvents.GetItem, "Getting item {Id}", id);

    var todoItem = await _context.TodoItems.FindAsync(id);

    if (todoItem == null)
    {
        _logger.LogWarning(MyLogEvents.GetItemNotFound, "Get({Id}) NOT FOUND", id);
        return NotFound();
    }

    return ItemToDTO(todoItem);
}

Dalam kode sebelumnya, parameter Log{LOG LEVEL} pertama, MyLogEvents.GetItem, adalah ID peristiwa log. Parameter kedua adalah template pesan dengan tempat penampung untuk nilai argumen yang disediakan oleh parameter metode yang tersisa. Parameter metode dijelaskan di bagian template pesan nanti dalam dokumentasi ini.

Panggil metode Log{LOG LEVEL} yang sesuai untuk mengontrol berapa banyak output log yang ditulis ke media penyimpanan tertentu. Contohnya:

  • Dalam produksi:
    • Pengelogan Tracedi tingkat , Debug, atau Information menghasilkan pesan log terperinci dalam volume tinggi. Untuk mengontrol biaya dan tidak melebihi batas penyimpanan data, log Trace, , Debugatau Information pesan tingkat ke penyimpanan data bervolutik tinggi dan berniaya rendah. Pertimbangkan untuk Tracemembatasi , Debug, atau Information untuk kategori tertentu.
    • Pengelogan pada tingkat Warning sampai Critical akan menghasilkan beberapa pesan log.
      • Batas biaya dan penyimpanan biasanya tidak menjadi masalah.
      • Beberapa log memungkinkan fleksibilitas yang lebih besar dalam hal pilihan penyimpanan data.
  • Dalam pengembangan:
    • Atur ke Warning.
    • Tambahkan Trace, Debug, atau Information pesan saat pemecahan masalah. Untuk membatasi output, atur Trace, Debug, atau Information hanya untuk kategori yang sedang diselidiki.

ASP.NET Core menulis log untuk peristiwa kerangka kerja. Misalnya, pertimbangkan output log untuk:

  • Aplikasi Razor Pages yang dibuat dengan template ASP.NET Core.
  • Pengelogan diatur ke Logging:Console:LogLevel:Microsoft:Information.
  • Navigasi ke halaman Privacy:
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 GET https://localhost:5001/Privacy
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint '/Privacy'
info: Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[3]
      Route matched with {page = "/Privacy"}. Executing page /Privacy
info: Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[101]
      Executing handler method DefaultRP.Pages.PrivacyModel.OnGet - ModelState is Valid
info: Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[102]
      Executed handler method OnGet, returned result .
info: Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[103]
      Executing an implicit handler method - ModelState is Valid
info: Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[104]
      Executed an implicit handler method, returned result Microsoft.AspNetCore.Mvc.RazorPages.PageResult.
info: Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[4]
      Executed page /Privacy in 74.5188ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint '/Privacy'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 149.3023ms 200 text/html; charset=utf-8

JSON berikut mengatur Logging:Console:LogLevel:Microsoft:Information:

{
  "Logging": {      // Default, all providers.
    "LogLevel": {
      "Microsoft": "Warning"
    },
    "Console": { // Console provider.
      "LogLevel": {
        "Microsoft": "Information"
      }
    }
  }
}

ID peristiwa log

Setiap log dapat menentukan ID peristiwa. Sampel aplikasi menggunakan kelas MyLogEvents untuk menentukan ID peristiwa:

public class MyLogEvents
{
    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 TestItem      = 3000;

    public const int GetItemNotFound    = 4000;
    public const int UpdateItemNotFound = 4001;
}
[HttpGet("{id}")]
public async Task<ActionResult<TodoItemDTO>> GetTodoItem(long id)
{
    _logger.LogInformation(MyLogEvents.GetItem, "Getting item {Id}", id);

    var todoItem = await _context.TodoItems.FindAsync(id);

    if (todoItem == null)
    {
        _logger.LogWarning(MyLogEvents.GetItemNotFound, "Get({Id}) NOT FOUND", id);
        return NotFound();
    }

    return ItemToDTO(todoItem);
}

ID peristiwa mengaitkan serangkaian peristiwa. Misalnya, semua log yang terkait dengan menampilkan daftar item pada halaman mungkin 1001.

Penyedia pengelogan dapat menyimpan ID peristiwa di bidang ID, dalam pesan pengelogan, atau tidak sama sekali. Penyedia Debug tidak menampilkan ID peristiwa. Penyedia konsol menunjukkan ID peristiwa dalam tanda kurung setelah kategori:

info: TodoApi.Controllers.TodoItemsController[1002]
      Getting item 1
warn: TodoApi.Controllers.TodoItemsController[4000]
      Get(1) NOT FOUND

Beberapa penyedia pengelogan menyimpan ID peristiwa di bidang, yang memungkinkan pemfilteran pada ID.

Template pesan log

Setiap API log menggunakan template pesan. Template pesan dapat berisi tempat penampung yang argumennya disediakan. Gunakan nama untuk tempat penampung, bukan angka.

[HttpGet("{id}")]
public async Task<ActionResult<TodoItemDTO>> GetTodoItem(long id)
{
    _logger.LogInformation(MyLogEvents.GetItem, "Getting item {Id}", id);

    var todoItem = await _context.TodoItems.FindAsync(id);

    if (todoItem == null)
    {
        _logger.LogWarning(MyLogEvents.GetItemNotFound, "Get({Id}) NOT FOUND", id);
        return NotFound();
    }

    return ItemToDTO(todoItem);
}

Urutan parameter, bukan nama tempat penampungnya, menentukan parameter mana yang digunakan untuk memberikan nilai tempat penampung dalam pesan log. Dalam kode berikut, nama parameter tidak berurutan di tempat penampung template pesan:

var apples = 1;
var pears = 2;
var bananas = 3;

_logger.LogInformation("Parameters: {Pears}, {Bananas}, {Apples}", apples, pears, bananas);

Namun, parameter ditetapkan ke tempat penampung dalam urutan: apples, pears, bananas. Pesan log mencerminkan urutan parameter:

Parameters: 1, 2, 3

Pendekatan ini memungkinkan penyedia pengelogan untuk mengimplementasikan pengelogan semantik atau terstruktur. Argumen itu sendiri diteruskan ke sistem pengelogan, bukan hanya template pesan yang diformat. Ini memungkinkan penyedia pengelogan untuk menyimpan nilai parameter sebagai bidang. Misalnya, pertimbangkan metode pencatat berikut:

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

Misalnya, saat mencatat ke Azure Table Storage:

  • Setiap entitas Azure Table dapat memiliki properti ID dan RequestTime.
  • Tabel dengan properti menyederhanakan kueri pada data yang dicatat. Misalnya, kueri dapat menemukan semua log dalam rentang RequestTime tertentu tanpa harus menguraikan waktu habis pesan teks.

Pengecualian log

Metode pencatat memiliki overload yang mengambil parameter pengecualian:

[HttpGet("{id}")]
public IActionResult TestExp(int id)
{
    var routeInfo = ControllerContext.ToCtxString(id);
    _logger.LogInformation(MyLogEvents.TestItem, routeInfo);

    try
    {
        if (id == 3)
        {
            throw new Exception("Test exception");
        }
    }
    catch (Exception ex)
    {
        _logger.LogWarning(MyLogEvents.GetItemNotFound, ex, "TestExp({Id})", id);
        return NotFound();
    }

    return ControllerContext.MyDisplayRouteInfo();
}

MyDisplayRouteInfo dan ToCtxString disediakan oleh paket NuGet Rick.Docs.Samples.RouteInfo. Metode menampilkan informasi rute Controller dan Razor Page.

Pengelogan pengecualian sifatnya khusus untuk penyedia.

Tingkat log default

Jika tingkat log bawaan tidak diatur, nilai tingkat log defaultnya adalah Information.

Misalnya, pertimbangkan aplikasi web berikut:

  • Dibuat dengan template aplikasi web ASP.NET.
  • appsettings.json dan appsettings.Development.json dihapus atau diganti namanya.

Dengan penyiapan sebelumnya, membuka halaman privasi atau beranda akan menghasilkan banyak pesan Trace, Debug, dan Information dengan Microsoft dalam nama kategori.

Kode berikut menetapkan tingkat log default ketika tingkat log default tidak diatur dalam konfigurasi:

var builder = WebApplication.CreateBuilder();
builder.Logging.SetMinimumLevel(LogLevel.Warning);

Umumnya, tingkat log harus ditentukan dalam konfigurasi dan bukan kode.

Fungsi filter

Fungsi filter dipanggil untuk semua penyedia dan kategori yang tidak memiliki aturan yang ditetapkan padanya oleh konfigurasi atau kode:

var builder = WebApplication.CreateBuilder();
builder.Logging.AddFilter((provider, category, logLevel) =>
{
    if (provider.Contains("ConsoleLoggerProvider")
        && category.Contains("Controller")
        && logLevel >= LogLevel.Information)
    {
        return true;
    }
    else if (provider.Contains("ConsoleLoggerProvider")
        && category.Contains("Microsoft")
        && logLevel >= LogLevel.Information)
    {
        return true;
    }
    else
    {
        return false;
    }
});

Kode sebelumnya menampilkan log konsol jika kategori berisi Controller atau Microsoft dan tingkat log adalah Information atau yang lebih tinggi.

Umumnya, tingkat log harus ditentukan dalam konfigurasi dan bukan kode.

ASP.NET Core dan EF Core kategori

Tabel berikut berisi beberapa kategori yang digunakan oleh ASP.NET Core dan Entity Framework Core, dengan catatan tentang log:

Kategori Catatan
Microsoft.AspNetCore Diagnostik ASP.NET Core umum.
Microsoft.AspNetCore.DataProtection Kunci mana yang dipertimbangkan, ditemukan, dan digunakan.
Microsoft.AspNetCore.HostFiltering Host diizinkan.
Microsoft.AspNetCore.Hosting Waktu yang diperlukan untuk menyelesaikan permintaan HTTP dan jam berapa dimulainya. Rakitan startup hosting mana yang dimuat.
Microsoft.AspNetCore.Mvc MVC dan diagnostik Razor. Pengikatan model, eksekusi filter, kompilasi tampilan, pemilihan tindakan.
Microsoft.AspNetCore.Routing Informasi pencocokan rute.
Microsoft.AspNetCore.Server Respons koneksi dimulai, berhenti, dan tetap aktif. Informasi sertifikat HTTPS.
Microsoft.AspNetCore.StaticFiles File yang disajikan.
Microsoft.EntityFrameworkCore Diagnostik Entity Framework Core Umum. Aktivitas dan konfigurasi database, deteksi perubahan, migrasi.

Untuk melihat kategori lainnya di jendela konsol, atur appsettings.Development.json menjadi berikut ini:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Trace",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}

Cakupan log

Cakupan dapat mengelompokkan serangkaian operasi logis. Pengelompokan ini dapat digunakan untuk melampirkan data yang sama ke setiap log yang dibuat sebagai bagian dari kumpulan. Misalnya, setiap log yang dibuat sebagai bagian dari pemrosesan transaksi dapat menyertakan ID transaksi.

Cakupan:

Penyedia berikut mendukung cakupan:

Gunakan cakupan dengan membungkus panggilan pencatat di blok using:

[HttpGet("{id}")]
public async Task<ActionResult<TodoItemDTO>> GetTodoItem(long id)
{
    TodoItem todoItem;
    var transactionId = Guid.NewGuid().ToString();
    using (_logger.BeginScope(new List<KeyValuePair<string, object>>
        {
            new KeyValuePair<string, object>("TransactionId", transactionId),
        }))
    {
        _logger.LogInformation(MyLogEvents.GetItem, "Getting item {Id}", id);

        todoItem = await _context.TodoItems.FindAsync(id);

        if (todoItem == null)
        {
            _logger.LogWarning(MyLogEvents.GetItemNotFound, 
                "Get({Id}) NOT FOUND", id);
            return NotFound();
        }
    }

    return ItemToDTO(todoItem);
}

Penyedia pengelogan bawaan

ASP.NET Core menyertakan penyedia pengelogan berikut sebagai bagian dari kerangka kerja bersama:

Penyedia pengelogan berikut dikirimkan oleh Microsoft, tetapi bukan sebagai bagian dari kerangka kerja bersama. Penyedia ini harus dipasang sebagai nuget tambahan.

ASP.NET Core tidak menyertakan penyedia pengelogan untuk menulis log ke file. Untuk menulis log ke file dari aplikasi ASP.NET Core, pertimbangkan untuk menggunakan penyedia pengelogan pihak ketiga.

Untuk informasi tentang pengelogan stdout dan debug dengan ASP.NET Core Module, lihat Memecahkan Masalah ASP.NET Core di Azure App Service dan IIS dan ASP.NET Core Module (ANCM) untuk IIS.

Konsol

Penyedia Console mencatat output ke konsol. Untuk informasi lebih lanjut tentang melihat log Console dalam pengembangan, lihat Mencatat output dari eksekusi dotnet dan Visual Studio .

Debug

Penyedia Debug menulis output log dengan menggunakan kelas System.Diagnostics.Debug. Panggilan untuk System.Diagnostics.Debug.WriteLine menulis ke penyedia Debug.

Di Linux, lokasi log penyedia Debug bergantung pada distribusi dan mungkin salah satu dari berikut ini:

  • /var/log/message
  • /var/log/syslog

Sumber Kejadian

Penyedia EventSource menulis ke sumber kejadian lintas platform dengan nama Microsoft-Extensions-Logging. Di Windows, penyedia menggunakan ETW.

alat dotnet-trace

Alat dotnet-trace adalah alat global CLI lintas platform yang memungkinkan pengumpulan jejak .NET Core dari proses yang berjalan. Alat ini mengumpulkan data penyedia Microsoft.Extensions.Logging.EventSource menggunakan LoggingEventSource.

Untuk petunjuk penginstalan, lihat dotnet-trace.

Gunakan alat dotnet-trace untuk mengumpulkan jejak dari aplikasi:

  1. Jalankan aplikasi dengan perintah dotnet run.

  2. Tentukan pengidentifikasi proses (PID) dari aplikasi .NET Core:

    dotnet-trace ps
    

    Temukan PID untuk proses yang memiliki nama yang sama dengan rakitan aplikasi.

  3. Jalankan perintah dotnet-trace.

    Sintaks perintah umum:

    dotnet-trace collect -p {PID} 
        --providers Microsoft-Extensions-Logging:{Keyword}:{Provider Level}
            :FilterSpecs=\"
                {Logger Category 1}:{Category Level 1};
                {Logger Category 2}:{Category Level 2};
                ...
                {Logger Category N}:{Category Level N}\"
    

    Saat menggunakan shell perintah PowerShell, apit nilai --providers dalam tanda kutip tunggal ('):

    dotnet-trace collect -p {PID} 
        --providers 'Microsoft-Extensions-Logging:{Keyword}:{Provider Level}
            :FilterSpecs=\"
                {Logger Category 1}:{Category Level 1};
                {Logger Category 2}:{Category Level 2};
                ...
                {Logger Category N}:{Category Level N}\"'
    

    Pada platform non-Windows, tambahkan opsi -f speedscope untuk mengubah format file jejak output menjadi speedscope.

    Tabel berikut mendefinisikan Kata Kunci:

    Kata kunci Deskripsi
    1 Catat peristiwa meta tentang LoggingEventSource. Tidak mencatat peristiwa dari ILogger.
    2 Mengaktifkan peristiwa Message saat ILogger.Log() dipanggil. Memberikan informasi dengan cara terprogram (tidak diformat).
    4 Mengaktifkan peristiwa FormatMessage saat ILogger.Log() dipanggil. Menyediakan informasi versi string yang diformat.
    8 Mengaktifkan peristiwa MessageJson saat ILogger.Log() dipanggil. Memberikan representasi JSON argumen.

    Tabel berikut mencantumkan tingkat penyedia:

    Tingkat Penyedia Deskripsi
    0 LogAlways
    1 Critical
    2 Error
    3 Warning
    4 Informational
    5 Verbose

    Penguraian untuk tingkat kategori dapat berupa string atau angka:

    Kategori bernama nilai Nilai numerik
    Trace 0
    Debug 1
    Information 2
    Warning 3
    Error 4
    Critical 5

    Tingkat penyedia dan tingkat kategori:

    • Berada dalam urutan terbalik.
    • Tidak semua konstanta string identik.

    Jika tidak ada FilterSpecs yang ditentukan, maka implementasi EventSourceLogger mencoba mengonversi tingkat penyedia ke tingkat kategori dan menerapkannya ke semua kategori.

    Tingkat Penyedia Tingkat Kategori
    Verbose(5) Debug(1)
    Informational(4) Information(2)
    Warning(3) Warning(3)
    Error(2) Error(4)
    Critical(1) Critical(5)

    Jika FilterSpecs disediakan, kategori apa pun yang disertakan dalam daftar menggunakan tingkat kategori yang dienkode di sana, semua kategori lainnya difilter.

    Contoh berikut mengasumsikan:

    • Aplikasi sedang berjalan dan memanggil logger.LogDebug("12345").
    • ID proses (PID) telah diatur melalui set PID=12345, di mana 12345 adalah PID yang sebenarnya.

    Pertimbangkan perintah berikut:

    dotnet-trace collect -p %PID% --providers Microsoft-Extensions-Logging:4:5
    

    Perintah sebelumnya:

    • Mengambil pesan debug.
    • Tidak menerapkan FilterSpecs.
    • Menentukan tingkat 5 yang memetakan Debug kategori.

    Pertimbangkan perintah berikut:

    dotnet-trace collect -p %PID%  --providers Microsoft-Extensions-Logging:4:5:\"FilterSpecs=*:5\"
    

    Perintah sebelumnya:

    • Tidak mengambil pesan debug karena tingkat kategori 5 adalah Critical.
    • Menyediakan FilterSpecs.

    Perintah berikut mengambil pesan debug karena kategori tingkat 1 menentukan Debug.

    dotnet-trace collect -p %PID%  --providers Microsoft-Extensions-Logging:4:5:\"FilterSpecs=*:1\"
    

    Perintah berikut mengambil pesan debug karena kategori menentukan Debug.

    dotnet-trace collect -p %PID%  --providers Microsoft-Extensions-Logging:4:5:\"FilterSpecs=*:Debug\"
    

    Entri FilterSpecs untuk {Logger Category} dan {Category Level} mewakili kondisi pemfilteran log tambahan. Pisahkan entri FilterSpecs dengan karakter titik koma ;.

    Contoh menggunakan shell perintah Windows:

    dotnet-trace collect -p %PID% --providers Microsoft-Extensions-Logging:4:2:FilterSpecs=\"Microsoft.AspNetCore.Hosting*:4\"
    

    Perintah sebelumnya mengaktifkan:

    • Pencatat Sumber Kejadian untuk menghasilkan string yang diformat (4) untuk kesalahan (2).
    • Pengelogan Microsoft.AspNetCore.Hosting di tingkat pengelogan Informational (4).
  4. dotnet-trace Hentikan alat dengan menekan tombol Enter atau Ctrl+C.

    Jejak disimpan dengan nama trace.nettrace di folder tempat perintah dotnet-trace dijalankan.

  5. Buka jejak dengan Perfview. Buka file trace.nettrace dan jelajahi peristiwa pelacakan jejak.

Jika aplikasi tidak membangun host dengan WebApplication.CreateBuilder, tambahkan penyedia Sumber Kejadian ke konfigurasi pengelogan aplikasi.

Untuk informasi selengkapnya, lihat:

Perfview

Gunakan utilitas PerfView untuk mengumpulkan dan melihat log. Ada alat lain untuk melihat log ETW, tetapi PerfView memberikan pengalaman terbaik untuk bekerja dengan peristiwa ETW yang dipancarkan oleh ASP.NET Core.

Untuk mengonfigurasi PerfView agar mengumpulkan peristiwa yang dicatat oleh penyedia ini, tambahkan string *Microsoft-Extensions-Logging ke daftar Penyedia Tambahan. Jangan lewatkan * di awal string.

EventLog Windows

Penyedia EventLog mengirimkan output log ke Log Peristiwa Windows. Tidak seperti penyedia lainnya, penyedia EventLogtidak mewarisi pengaturan non-penyedia default. Jika pengaturan log EventLog tidak ditentukan, pengaturan defaultnya adalah LogLevel.Warning.

Untuk mencatat peristiwa yang lebih rendah dari LogLevel.Warning, atur tingkat log secara eksplisit. Contoh berikut mengatur tingkat log default Log Peristiwa ke LogLevel.Information:

"Logging": {
  "EventLog": {
    "LogLevel": {
      "Default": "Information"
    }
  }
}

Overload AddEventLog dapat meneruskan EventLogSettings. Jika null atau tidak ditentukan, pengaturan bawaan berikut akan digunakan:

  • LogName: "Aplikasi"
  • SourceName: ".NET Runtime"
  • MachineName: Nama komputer lokal yang digunakan.

Kode berikut mengubah SourceName dari nilai default ".NET Runtime" menjadi MyLogs:


var builder = WebApplication.CreateBuilder();
builder.Logging.AddEventLog(eventLogSettings =>
{
    eventLogSettings.SourceName = "MyLogs";
});

Azure App Service

Paket penyedia Microsoft.Extensions.Logging.AzureAppServices menulis log ke file teks di sistem file aplikasi Azure App Service dan ke penyimpanan blob di akun Azure Storage.

Paket penyedia tidak disertakan dalam kerangka kerja bersama. Untuk menggunakan penyedia, tambahkan paket penyedia ke proyek.

Untuk mengonfigurasi pengaturan penyedia, gunakan AzureFileLoggerOptions dan AzureBlobLoggerOptions, seperti yang ditunjukkan pada contoh berikut:

using Microsoft.Extensions.Logging.AzureAppServices;

var builder = WebApplication.CreateBuilder();
builder.Logging.AddAzureWebAppDiagnostics();
builder.Services.Configure<AzureFileLoggerOptions>(options =>
{
    options.FileName = "azure-diagnostics-";
    options.FileSizeLimit = 50 * 1024;
    options.RetainedFileCountLimit = 5;
});
builder.Services.Configure<AzureBlobLoggerOptions>(options =>
{
    options.BlobName = "log.txt";
});

Saat disebarkan ke Azure App Service, aplikasi menggunakan pengaturan di bagian Log App Service pada halaman App Service di portal Azure. Saat pengaturan berikut diperbarui, perubahan akan langsung berlaku tanpa memerlukan mulai ulang atau penyebaran ulang aplikasi.

  • Pengelogan Aplikasi (Filesystem)
  • Pengelogan Aplikasi (Blob)

Lokasi default untuk file log ada di folder D:\\home\\LogFiles\\Application, dan nama file defaultnya adalah diagnostics-yyyymmdd.txt. Batas ukuran file default adalah 10 MB, dan jumlah maksimum default file yang dipertahankan adalah 2. Nama blob default adalah {app-name}{timestamp}/yyyy/mm/dd/hh/{guid}-applicationLog.txt.

Penyedia ini hanya mencatat saat proyek berjalan di lingkungan Azure.

Azure log streaming

Azure log streaming mendukung melihat aktivitas log secara real time dari:

  • Server aplikasi
  • Server web
  • Pelacakan permintaan gagal

Untuk mengonfigurasi Azure log streaming:

  • Buka halaman Log App Service dari halaman portal aplikasi.
  • Atur Pengelogan Aplikasi (Filesystem) ke Aktif.
  • Pilih Tingkat log. Pengaturan ini hanya berlaku untuk Azure log streaming.

Buka halaman Aliran Log untuk melihat log. Pesan yang dicatat akan dicatat dengan antarmuka ILogger.

Azure Application Insights

Paket penyedia Microsoft.Extensions.Logging.ApplicationInsights menulis log ke Azure Application Insights. Application Insights adalah layanan yang memantau aplikasi web dan menyediakan alat untuk mengkueri dan menganalisis data telemetri. Jika menggunakan penyedia ini, Anda dapat membuat kueri dan menganalisis log menggunakan alat Application Insights.

Penyedia pengelogan disertakan sebagai dependensi Microsoft.ApplicationInsights.AspNetCore, yang merupakan paket yang menyediakan semua telemetri yang tersedia untuk ASP.NET Core. Jika Anda menggunakan paket ini, Anda tidak perlu memasang paket penyedia.

Paket Microsoft.ApplicationInsights.Web adalah untuk ASP.NET 4.x, bukan ASP.NET Core.

Untuk informasi selengkapnya, lihat sumber daya berikut:

Penyedia pengelogan pihak ketiga

Kerangka kerja pengelogan pihak ketiga yang berfungsi dengan ASP.NET Core:

Beberapa kerangka kerja pihak ketiga dapat melakukan pengelogan semantik, yang juga dikenal sebagai pengelogan terstruktur.

Menggunakan kerangka kerja pihak ketiga mirip dengan menggunakan salah satu penyedia bawaan:

  1. Tambahkan paket NuGet ke proyek Anda.
  2. Panggil metode ekstensi ILoggerFactory yang disediakan oleh kerangka kerja pengelogan.

Untuk informasi lebih lanjut, lihat dokumentasi masing-masing penyedia. Penyedia pengelogan pihak ketiga tidak didukung oleh Microsoft.

Tidak ada metode pencatat asinkron

Pengelogan harus dilakukan dengan sangat cepat sehingga tidak sebanding dengan biaya performa dari kode asinkron. Jika penyimpanan data pengelogan lambat, jangan langsung menulisnya. Pertimbangkan untuk terlebih dahulu menulis pesan log ke penyimpanan cepat, lalu memindahkannya ke penyimpanan lambat nanti. Misalnya, saat mencatat ke SQL Server, jangan lakukan secara langsung dalam metode Log, karena metode Log bersifat sinkron. Sebagai gantinya, tambahkan pesan log secara sinkron ke antrean dalam memori dan minta pekerja latar belakang untuk menarik pesan keluar dari antrean untuk melakukan pekerjaan asinkron berupa mendorong data ke SQL Server. Untuk informasi lebih lanjut, lihat Panduan tentang cara mencatat ke antrean pesan untuk penyimpanan data yang lambat (dotnet/AspNetCore.Docs #11801).

Mengubah tingkat log di aplikasi yang sedang berjalan

Logging API tidak menyertakan skenario untuk mengubah tingkat log saat aplikasi sedang berjalan. Namun, beberapa penyedia konfigurasi mampu untuk memuat ulang konfigurasi, yang langsung berpengaruh pada konfigurasi pengelogan. Misalnya, Penyedia Konfigurasi File, memuat ulang konfigurasi pengelogan secara default. Jika konfigurasi diubah dalam kode saat aplikasi sedang berjalan, aplikasi dapat memanggil IConfigurationRoot.Reload untuk memperbarui konfigurasi pengelogan aplikasi.

ILogger dan ILoggerFactory

Antarmuka dan implementasi ILogger<TCategoryName> dan ILoggerFactory disertakan dalam .NET Core SDK. Mereka juga tersedia dalam paket NuGet berikut:

Menerapkan aturan filter log dalam kode

Pendekatan yang lebih disukai untuk menyetel aturan filter log adalah dengan menggunakan Konfigurasi.

Contoh berikut menunjukkan cara mendaftarkan aturan filter dalam kode:

using Microsoft.Extensions.Logging.Console;
using Microsoft.Extensions.Logging.Debug;

var builder = WebApplication.CreateBuilder();
builder.Logging.AddFilter("System", LogLevel.Debug);
builder.Logging.AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Information);
builder.Logging.AddFilter<ConsoleLoggerProvider>("Microsoft", LogLevel.Trace);

logging.AddFilter("System", LogLevel.Debug) menentukan kategori System dan Debug tingkat log. Filter diterapkan ke semua penyedia karena penyedia tertentu tidak dikonfigurasi.

AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Information) menentukan:

  • Penyedia pengelogan Debug.
  • Tingkat log Information dan lebih tinggi.
  • Semua kategori dimulai dengan "Microsoft".

Secara otomatis mencatat cakupan dengan SpanId, TraceId, ParentId, Baggage, dan Tags.

Pustaka pengelogan secara implisit membuat objek cakupan dengan SpanId, TraceId, ParentId, Baggage, dan Tags. Perilaku ini dikonfigurasi melalui ActivityTrackingOptions.

var builder = WebApplication.CreateBuilder(args);

builder.Logging.AddSimpleConsole(options =>
{
    options.IncludeScopes = true;
});

builder.Logging.Configure(options =>
{
    options.ActivityTrackingOptions = ActivityTrackingOptions.SpanId
                                       | ActivityTrackingOptions.TraceId
                                       | ActivityTrackingOptions.ParentId
                                       | ActivityTrackingOptions.Baggage
                                       | ActivityTrackingOptions.Tags;
});
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

Jika header permintaan http traceparent diatur, ParentId dalam cakupan log menunjukkan parent-id W3C dari header traceparent masuk dan SpanId dalam cakupan log menunjukkan parent-id yang diperbarui untuk langkah/rentang keluar berikutnya. Untuk informasi lebih lanjut, lihat Mengubah Bidang traceparent.

Membuat pencatat kustom

Untuk membuat pencatat kustom, lihat Mengimplementasikan penyedia pengelogan kustom di .NET.

Sumber Daya Tambahan:

Oleh Kirk Larkin, Juergen Gutsch, dan Rick Anderson

Topik ini menjelaskan pengelogan di .NET karena ini berlaku untuk aplikasi ASP.NET Core. Untuk informasi rinci tentang pengelogan di .NET, lihat Pengelogan di .NET. Untuk informasi lebih lanjut tentang pengelogan di aplikasi Blazor, lihat Pengelogan Blazor ASP.NET Core.

Lihat atau unduh sampel kode (cara mengunduh).

Penyedia pengelogan

Penyedia pengelogan menyimpan log, kecuali penyedia Console, yang menampilkan log. Misalnya, penyedia Azure Application Insights menyimpan log di Azure Application Insights. Beberapa penyedia dapat diaktifkan.

Template aplikasi web ASP.NET Core default:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

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

Kode sebelumnya menunjukkan kelas Program yang dibuat dengan template aplikasi web ASP.NET Core. Beberapa bagian berikutnya memberikan sampel berdasarkan template aplikasi web ASP.NET Core, yang menggunakan Host Generik. Aplikasi konsol non-host dibahas nanti dalam dokumentasi ini.

Untuk menimpa set default penyedia pengelogan yang ditambahkan oleh Host.CreateDefaultBuilder, panggil ClearProviders dan tambahkan penyedia pengelogan yang diperlukan. Misalnya, kode berikut:

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

Untuk penyedia tambahan, lihat:

Membuat log

Untuk membuat log, gunakan objek ILogger<TCategoryName> dari injeksi dependensi (DI).

Lihat contoh berikut:

  • Membuat pencatat, ILogger<AboutModel>, yang menggunakan kategori log dengan nama yang sepenuhnya memenuhi syarat dari jenis AboutModel. Kategori log adalah string yang terkait dengan setiap log.
  • Memanggil LogInformation untuk mencatat pada tingkat Information. Tingkat log menunjukkan tingkat keparahan peristiwa yang dicatat.
public class AboutModel : PageModel
{
    private readonly ILogger _logger;

    public AboutModel(ILogger<AboutModel> logger)
    {
        _logger = logger;
    }
    public string Message { get; set; }

    public void OnGet()
    {
        Message = $"About page visited at {DateTime.UtcNow.ToLongTimeString()}";
        _logger.LogInformation(Message);
    }
}

Tingkat dan kategori dijelaskan lebih rinci nanti dalam dokumentasi ini.

Untuk informasi tentang Blazor, lihat Pengelogan Blazor ASP.NET Core.

Buat log di Utama dan Startup menunjukkan cara membuat log di Main dan Startup.

Mengonfigurasi pengelogan

Konfigurasi pengelogan biasanya disediakan oleh bagian Logging dari file appsettings.{Environment}.json. File appsettings.Development.json berikut dibuat oleh template aplikasi web ASP.NET Core:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}

Di JSON sebelumnya:

  • Kategori "Default", "Microsoft", dan "Microsoft.Hosting.Lifetime" ditentukan.
  • Kategori "Microsoft" berlaku untuk semua kategori yang dimulai dengan "Microsoft". Misalnya, pengaturan ini berlaku untuk kategori "Microsoft.AspNetCore.Routing.EndpointMiddleware".
  • Kategori "Microsoft" mencatat pada tingkat log Warning dan yang lebih tinggi.
  • Kategori "Microsoft.Hosting.Lifetime" lebih spesifik daripada kategori "Microsoft", sehingga kategori "Microsoft.Hosting.Lifetime" mencatat pada tingkat log "Informasi" dan yang lebih tinggi.
  • Penyedia log tertentu tidak ditentukan, jadi LogLevel berlaku untuk semua penyedia pengelogan yang diaktifkan kecuali untuk Windows EventLog.

Properti Logging dapat memiliki LogLevel dan properti penyedia log. LogLevel menentukan tingkat minimum yang akan dicatat untuk kategori yang dipilih. Di JSON sebelumnya, tingkat log Information dan Warning ditentukan. LogLevel menunjukkan tingkat keparahan log dan memiliki rentang 0 hingga 6:

Trace = 0, Debug = 1, Information = 2, Warning = 3, Error = 4, Critical = 5, dan None = 6.

Bila LogLevel ditetapkan, pengelogan diaktifkan untuk pesan pada tingkat yang ditentukan dan lebih tinggi. Pada JSON sebelumnya, kategori Default dicatat untuk Information dan yang lebih tinggi. Misalnya, pesan Information, Warning, Error, dan Critical dicatat. Jika tidak ada LogLevel yang ditentukan, pengelogan diatur ke default, yakni tingkat Information. Untuk informasi lebih lanjut, lihat Tingkat log.

Properti penyedia dapat menentukan properti LogLevel. LogLevel di bawah penyedia menentukan tingkat yang perlu dicatat untuk penyedia tersebut, dan menimpa pengaturan log non-penyedia. Pertimbangkan file appsettings.json berikut:

{
  "Logging": {
    "LogLevel": { // All providers, LogLevel applies to all the enabled providers.
      "Default": "Error", // Default logging, Error and higher.
      "Microsoft": "Warning" // All Microsoft* categories, Warning and higher.
    },
    "Debug": { // Debug provider.
      "LogLevel": {
        "Default": "Information", // Overrides preceding LogLevel:Default setting.
        "Microsoft.Hosting": "Trace" // Debug:Microsoft.Hosting category.
      }
    },
    "EventSource": { // EventSource provider
      "LogLevel": {
        "Default": "Warning" // All categories of EventSource provider.
      }
    }
  }
}

Pengaturan di Logging.{providername}.LogLevel menimpa pengaturan di Logging.LogLevel. Pada JSON sebelumnya, tingkat log default penyedia Debug diatur ke Information:

Logging:Debug:LogLevel:Default:Information

Pengaturan sebelumnya menetapkan tingkat log Information untuk setiap kategori Logging:Debug: kecuali Microsoft.Hosting. Ketika kategori tertentu dicantumkan, kategori tersebut menimpa kategori default. Pada JSON sebelumnya, "Microsoft.Hosting" dan "Default" kategori Logging:Debug:LogLevel menimpa pengaturan di Logging:LogLevel

Tingkat log minimum dapat ditentukan untuk salah satu dari:

  • Penyedia tertentu: Misalnya, Logging:EventSource:LogLevel:Default:Information
  • Kategori tertentu: Misalnya, Logging:LogLevel:Microsoft:Warning
  • Semua penyedia dan semua kategori: Logging:LogLevel:Default:Warning

Setiap log di bawah tingkat minimum tidak:

  • Diteruskan ke penyedia.
  • Dicatat atau ditampilkan.

Untuk menyembunyikan semua log, tentukan LogLevel.None. LogLevel.None memiliki nilai 6, yang lebih tinggi dari LogLevel.Critical (5).

Jika penyedia mendukung cakupan log, IncludeScopes menunjukkan apakah cakupan diaktifkan. Untuk informasi lebih lanjut, lihat cakupan log

File appsettings.json berikut berisi semua penyedia yang diaktifkan secara default:

{
  "Logging": {
    "LogLevel": { // No provider, LogLevel applies to all the enabled providers.
      "Default": "Error",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Warning"
    },
    "Debug": { // Debug provider.
      "LogLevel": {
        "Default": "Information" // Overrides preceding LogLevel:Default setting.
      }
    },
    "Console": {
      "IncludeScopes": true,
      "LogLevel": {
        "Microsoft.AspNetCore.Mvc.Razor.Internal": "Warning",
        "Microsoft.AspNetCore.Mvc.Razor.Razor": "Debug",
        "Microsoft.AspNetCore.Mvc.Razor": "Error",
        "Default": "Information"
      }
    },
    "EventSource": {
      "LogLevel": {
        "Microsoft": "Information"
      }
    },
    "EventLog": {
      "LogLevel": {
        "Microsoft": "Information"
      }
    },
    "AzureAppServicesFile": {
      "IncludeScopes": true,
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "AzureAppServicesBlob": {
      "IncludeScopes": true,
      "LogLevel": {
        "Microsoft": "Information"
      }
    },
    "ApplicationInsights": {
      "LogLevel": {
        "Default": "Information"
      }
    }
  }
}

Dalam sampel sebelumnya:

  • Kategori dan tingkat bukanlah nilai yang disarankan. Sampel disediakan untuk menunjukkan semua penyedia default.
  • Pengaturan di Logging.{providername}.LogLevel menimpa pengaturan di Logging.LogLevel. Misalnya, tingkat di Debug.LogLevel.Default menggantikan tingkat di LogLevel.Default.
  • Setiap alias penyedia default digunakan. Setiap penyedia mendefinisikan alias yang dapat digunakan dalam konfigurasi, yang menggantikan nama jenis yang sepenuhnya memenuhi syarat. Alias penyedia bawaan adalah:
    • Konsol
    • Debug
    • EventSource
    • EventLog
    • AzureAppServicesFile
    • AzureAppServicesBlob
    • ApplicationInsights

Tetapkan tingkat log berdasarkan baris perintah, variabel lingkungan, dan konfigurasi lainnya

Tingkat log dapat diatur oleh penyedia konfigurasi mana pun.

Pemisah : tidak berfungsi dengan kunci hierarkis variabel lingkungan di semua platform. __, garis bawah ganda:

  • Didukung oleh semua platform. Misalnya, pemisah : tidak didukung oleh Bash, tetapi __ didukung.
  • Secara otomatis diganti dengan :

berikut memberi perintah:

  • Atur Logging:LogLevel:Microsoft kunci lingkungan ke nilai Information di Windows.
  • Uji pengaturan saat menggunakan aplikasi yang dibuat dengan template aplikasi web ASP.NET Core. Perintah dotnet run harus dijalankan di direktori proyek setelah menggunakan set.
set Logging__LogLevel__Microsoft=Information
dotnet run

Pengaturan lingkungan sebelumnya:

  • Hanya diatur dalam proses yang diluncurkan dari jendela perintah tempatnya diatur.
  • Tidak dibaca oleh browser yang diluncurkan dengan Visual Studio.

Perintah setx berikut juga mengatur kunci dan nilai lingkungan di Windows. Tidak seperti set, pengaturan setx tetap ada. Pengalih /M mengatur variabel di lingkungan sistem. Jika /M tidak digunakan, variabel lingkungan pengguna diatur.

setx Logging__LogLevel__Microsoft Information /M

Pertimbangkan file appsettings.json berikut:

"Logging": {
    "Console": {
      "LogLevel": {
        "Microsoft.Hosting.Lifetime": "Trace"
      }
    }
}

Perintah berikut menetapkan konfigurasi sebelumnya di lingkungan:

setx Logging__Console__LogLevel__Microsoft.Hosting.Lifetime Trace /M

Pada Azure App Service, pilih Pengaturan aplikasi baru di halaman Pengaturan > Konfigurasi. Pengaturan aplikasi Azure App Service:

  • Dienkripsi saat tidak aktif dan ditransmisikan melalui saluran terenkripsi.
  • Diekspos sebagai variabel lingkungan.

Untuk informasi lebih lanjut, lihat Aplikasi Azure: Menimpa konfigurasi aplikasi menggunakan Portal Azure.

Untuk informasi lebih lanjut tentang mengatur nilai konfigurasi ASP.NET Core menggunakan variabel lingkungan, lihat variabel lingkungan. Untuk informasi tentang penggunaan sumber konfigurasi lain, termasuk baris perintah, Azure Key Vault, Azure App Configuration, format file lain, dan lainnya, lihat Konfigurasi di ASP.NET Core.

Bagaimana aturan pemfilteran diterapkan

Saat objek ILogger<TCategoryName> dibuat, objek ILoggerFactory memilih satu aturan per penyedia untuk diterapkan ke pencatat tersebut. Semua pesan yang ditulis oleh instans ILogger difilter berdasarkan aturan yang dipilih. Aturan paling spesifik untuk setiap pasangan penyedia dan kategori dipilih dari aturan yang tersedia.

Algoritma berikut digunakan untuk setiap penyedia saat ILogger dibuat untuk kategori tertentu:

  • Pilih semua aturan yang cocok dengan penyedia atau aliasnya. Jika tidak ditemukan kecocokan, pilih semua aturan dengan penyedia yang kosong.
  • Dari hasil langkah sebelumnya, pilih aturan dengan awalan kategori yang cocok terpanjang. Jika tidak ada kecocokan yang ditemukan, pilih semua aturan yang tidak menentukan kategori.
  • Jika beberapa aturan dipilih, ambil yang terakhir.
  • Jika tidak ada aturan yang dipilih, gunakan MinimumLevel.

Pengelogan output dari eksekusi dotnet dan Visual Studio

Log yang dibuat dengan penyedia pengelogan default ditampilkan:

  • Di Visual Studio
    • Di jendela output Debug saat penelusuran kesalahan.
    • Di jendela Server Web ASP.NET Core.
  • Di jendela konsol saat aplikasi dijalankan dengan dotnet run.

Log yang dimulai dengan kategori "Microsoft" berasal dari kode kerangka kerja ASP.NET Core. ASP.NET Core dan kode aplikasi menggunakan API dan penyedia pengelogan yang sama.

Kategori log

Saat objek ILogger dibuat, kategori ditentukan. Kategori tersebut disertakan dengan setiap pesan log yang dibuat oleh instans ILogger tersebut. String kategori bersifat arbitrer, tetapi konvensinya adalah menggunakan nama kelas. Misalnya, dalam pengontrol, namanya mungkin "TodoApi.Controllers.TodoController". Aplikasi web ASP.NET Core menggunakan ILogger<T> untuk secara otomatis mendapatkan instans ILogger yang menggunakan nama jenis T yang sepenuhnya memenuhi syarat sebagai kategori:

public class PrivacyModel : PageModel
{
    private readonly ILogger<PrivacyModel> _logger;

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

    public void OnGet()
    {
        _logger.LogInformation("GET Pages.PrivacyModel called.");
    }
}

Untuk menentukan kategori secara eksplisit, panggil ILoggerFactory.CreateLogger:

public class ContactModel : PageModel
{
    private readonly ILogger _logger;

    public ContactModel(ILoggerFactory logger)
    {
        _logger = logger.CreateLogger("TodoApi.Pages.ContactModel.MyCategory");
    }

    public void OnGet()
    {
        _logger.LogInformation("GET Pages.ContactModel called.");
    }

Pemanggilan CreateLogger dengan nama tetap dapat berguna bila digunakan dalam beberapa metode sehingga peristiwa dapat diatur berdasarkan kategori.

ILogger<T> sama dengan memanggil CreateLogger, dengan nama jenis T yang sepenuhnya memenuhi syarat.

Tingkat log

Tabel berikut mencantumkan nilai LogLevel, metode ekstensi Log{LogLevel} yang praktis, dan penggunaan yang disarankan:

LogLevel Nilai Metode Deskripsi
Jejak 0 LogTrace Berisi pesan paling terperinci. Pesan ini mungkin berisi data aplikasi yang sensitif. Pesan-pesan ini dinonaktifkan secara default dan tidak boleh diaktifkan dalam produksi.
Debug 1 LogDebug Untuk penelusuran kesalahan dan pengembangan. Gunakan dengan hati-hati dalam produksi karena volume yang tinggi.
Informasi 2 LogInformation Melacak alur umum aplikasi. Mungkin memiliki nilai jangka panjang.
Peringatan 3 LogWarning Untuk peristiwa yang tidak normal atau tidak terduga. Biasanya menyertakan kesalahan atau kondisi yang tidak menyebabkan aplikasi gagal.
Kesalahan 4 LogError Untuk kesalahan dan pengecualian yang tidak dapat ditangani. Pesan-pesan ini menunjukkan kegagalan dalam operasi atau permintaan saat ini, bukan kegagalan di seluruh aplikasi.
Kritis 5 LogCritical Untuk kegagalan yang membutuhkan perhatian sesegera mungkin. Contoh: skenario kehilangan data, ruang disk yang habis.
Tidak 6 Menentukan bahwa kategori pengelogan tidak boleh menulis pesan apa pun.

Pada tabel sebelumnya, LogLevel dicantumkan dari tingkat keparahan terendah hingga tertinggi.

Parameter pertama metode Log, LogLevel, menunjukkan tingkat keparahan log. Alih-alih memanggil Log(LogLevel, ...), sebagian besar pengembang memanggil metode ekstensi Log{LogLevel}. Metode ekstensi Log{LogLevel}memanggil metode Log dan menentukan LogLevel. Misalnya, dua panggilan pengelogan berikut secara fungsional setara dan menghasilkan log yang sama:

[HttpGet]
public IActionResult Test1(int id)
{
    var routeInfo = ControllerContext.ToCtxString(id);

    _logger.Log(LogLevel.Information, MyLogEvents.TestItem, routeInfo);
    _logger.LogInformation(MyLogEvents.TestItem, routeInfo);

    return ControllerContext.MyDisplayRouteInfo();
}

MyLogEvents.TestItem adalah ID peristiwa. MyLogEvents adalah bagian dari sampel aplikasi dan ditampilkan di bagian ID peristiwa log.

MyDisplayRouteInfo dan ToCtxString disediakan oleh paket NuGet Rick.Docs.Samples.RouteInfo. Metode menampilkan informasi rute Controller dan Razor Page.

Kode berikut membuat log Information dan Warning:

[HttpGet("{id}")]
public async Task<ActionResult<TodoItemDTO>> GetTodoItem(long id)
{
    _logger.LogInformation(MyLogEvents.GetItem, "Getting item {Id}", id);

    var todoItem = await _context.TodoItems.FindAsync(id);

    if (todoItem == null)
    {
        _logger.LogWarning(MyLogEvents.GetItemNotFound, "Get({Id}) NOT FOUND", id);
        return NotFound();
    }

    return ItemToDTO(todoItem);
}

Dalam kode sebelumnya, parameter Log{LogLevel} pertama, MyLogEvents.GetItem, adalah ID peristiwa log. Parameter kedua adalah template pesan dengan tempat penampung untuk nilai argumen yang disediakan oleh parameter metode yang tersisa. Parameter metode dijelaskan di bagian template pesan nanti dalam dokumentasi ini.

Panggil metode Log{LogLevel} yang sesuai untuk mengontrol berapa banyak output log yang ditulis ke media penyimpanan tertentu. Contohnya:

  • Dalam produksi:
    • Pengelogan pada tingkat Trace atau Information menghasilkan pesan log terperinci dengan volume yang tinggi. Untuk mengontrol biaya dan tidak melebihi batas penyimpanan data, catat pesan tingkat Trace dan Information ke penyimpanan data bervolume tinggi dan berbiaya rendah. Pertimbangkan untuk membatasi Trace dan Information pada kategori tertentu.
    • Pengelogan pada tingkat Warning sampai Critical akan menghasilkan beberapa pesan log.
      • Batas biaya dan penyimpanan biasanya tidak menjadi masalah.
      • Beberapa log memungkinkan fleksibilitas yang lebih besar dalam hal pilihan penyimpanan data.
  • Dalam pengembangan:
    • Atur ke Warning.
    • Tambahkan pesan Trace atau Information saat memecahkan masalah. Untuk membatasi output, atur Trace atau Information hanya untuk kategori yang sedang diselidiki.

ASP.NET Core menulis log untuk peristiwa kerangka kerja. Misalnya, pertimbangkan output log untuk:

  • Aplikasi Razor Pages yang dibuat dengan template ASP.NET Core.
  • Pengelogan diatur ke Logging:Console:LogLevel:Microsoft:Information
  • Navigasi ke halaman Privacy:
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 GET https://localhost:5001/Privacy
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint '/Privacy'
info: Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[3]
      Route matched with {page = "/Privacy"}. Executing page /Privacy
info: Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[101]
      Executing handler method DefaultRP.Pages.PrivacyModel.OnGet - ModelState is Valid
info: Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[102]
      Executed handler method OnGet, returned result .
info: Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[103]
      Executing an implicit handler method - ModelState is Valid
info: Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[104]
      Executed an implicit handler method, returned result Microsoft.AspNetCore.Mvc.RazorPages.PageResult.
info: Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[4]
      Executed page /Privacy in 74.5188ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint '/Privacy'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 149.3023ms 200 text/html; charset=utf-8

JSON berikut mengatur Logging:Console:LogLevel:Microsoft:Information:

{
  "Logging": {      // Default, all providers.
    "LogLevel": {
      "Microsoft": "Warning"
    },
    "Console": { // Console provider.
      "LogLevel": {
        "Microsoft": "Information"
      }
    }
  }
}

ID peristiwa log

Setiap log dapat menentukan ID peristiwa. Sampel aplikasi menggunakan kelas MyLogEvents untuk menentukan ID peristiwa:

public class MyLogEvents
{
    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 TestItem      = 3000;

    public const int GetItemNotFound    = 4000;
    public const int UpdateItemNotFound = 4001;
}
[HttpGet("{id}")]
public async Task<ActionResult<TodoItemDTO>> GetTodoItem(long id)
{
    _logger.LogInformation(MyLogEvents.GetItem, "Getting item {Id}", id);

    var todoItem = await _context.TodoItems.FindAsync(id);

    if (todoItem == null)
    {
        _logger.LogWarning(MyLogEvents.GetItemNotFound, "Get({Id}) NOT FOUND", id);
        return NotFound();
    }

    return ItemToDTO(todoItem);
}

ID peristiwa mengaitkan serangkaian peristiwa. Misalnya, semua log yang terkait dengan menampilkan daftar item pada halaman mungkin 1001.

Penyedia pengelogan dapat menyimpan ID peristiwa di bidang ID, dalam pesan pengelogan, atau tidak sama sekali. Penyedia Debug tidak menampilkan ID peristiwa. Penyedia konsol menunjukkan ID peristiwa dalam tanda kurung setelah kategori:

info: TodoApi.Controllers.TodoItemsController[1002]
      Getting item 1
warn: TodoApi.Controllers.TodoItemsController[4000]
      Get(1) NOT FOUND

Beberapa penyedia pengelogan menyimpan ID peristiwa di bidang, yang memungkinkan pemfilteran pada ID.

Template pesan log

Setiap API log menggunakan template pesan. Template pesan dapat berisi tempat penampung yang argumennya disediakan. Gunakan nama untuk tempat penampung, bukan angka.

[HttpGet("{id}")]
public async Task<ActionResult<TodoItemDTO>> GetTodoItem(long id)
{
    _logger.LogInformation(MyLogEvents.GetItem, "Getting item {Id}", id);

    var todoItem = await _context.TodoItems.FindAsync(id);

    if (todoItem == null)
    {
        _logger.LogWarning(MyLogEvents.GetItemNotFound, "Get({Id}) NOT FOUND", id);
        return NotFound();
    }

    return ItemToDTO(todoItem);
}

Urutan parameter, bukan nama tempat penampungnya, menentukan parameter mana yang digunakan untuk memberikan nilai tempat penampung dalam pesan log. Dalam kode berikut, nama parameter tidak berurutan di tempat penampung template pesan:

var apples = 1;
var pears = 2;
var bananas = 3;

_logger.LogInformation("Parameters: {pears}, {bananas}, {apples}", apples, pears, bananas);

Namun, parameter ditetapkan ke tempat penampung dalam urutan: apples, pears, bananas. Pesan log mencerminkan urutan parameter:

Parameters: 1, 2, 3

Pendekatan ini memungkinkan penyedia pengelogan untuk mengimplementasikan pengelogan semantik atau terstruktur. Argumen itu sendiri diteruskan ke sistem pengelogan, bukan hanya template pesan yang diformat. Ini memungkinkan penyedia pengelogan untuk menyimpan nilai parameter sebagai bidang. Misalnya, pertimbangkan metode pencatat berikut:

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

Misalnya, saat mencatat ke Azure Table Storage:

  • Setiap entitas Azure Table dapat memiliki properti ID dan RequestTime.
  • Tabel dengan properti menyederhanakan kueri pada data yang dicatat. Misalnya, kueri dapat menemukan semua log dalam rentang RequestTime tertentu tanpa harus menguraikan waktu habis pesan teks.

Pengecualian log

Metode pencatat memiliki overload yang mengambil parameter pengecualian:

[HttpGet("{id}")]
public IActionResult TestExp(int id)
{
    var routeInfo = ControllerContext.ToCtxString(id);
    _logger.LogInformation(MyLogEvents.TestItem, routeInfo);

    try
    {
        if (id == 3)
        {
            throw new Exception("Test exception");
        }
    }
    catch (Exception ex)
    {
        _logger.LogWarning(MyLogEvents.GetItemNotFound, ex, "TestExp({Id})", id);
        return NotFound();
    }

    return ControllerContext.MyDisplayRouteInfo();
}

MyDisplayRouteInfo dan ToCtxString disediakan oleh paket NuGet Rick.Docs.Samples.RouteInfo. Metode menampilkan informasi rute Controller dan Razor Page.

Pengelogan pengecualian sifatnya khusus untuk penyedia.

Tingkat log default

Jika tingkat log bawaan tidak diatur, nilai tingkat log defaultnya adalah Information.

Misalnya, pertimbangkan aplikasi web berikut:

  • Dibuat dengan template aplikasi web ASP.NET.
  • appsettings.json dan appsettings.Development.json dihapus atau diganti namanya.

Dengan penyiapan sebelumnya, membuka halaman privasi atau beranda akan menghasilkan banyak pesan Trace, Debug, dan Information dengan Microsoft dalam nama kategori.

Kode berikut menetapkan tingkat log default ketika tingkat log default tidak diatur dalam konfigurasi:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

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

Umumnya, tingkat log harus ditentukan dalam konfigurasi dan bukan kode.

Fungsi filter

Fungsi filter dipanggil untuk semua penyedia dan kategori yang tidak memiliki aturan yang ditetapkan padanya oleh konfigurasi atau kode:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging =>
            {
                logging.AddFilter((provider, category, logLevel) =>
                {
                    if (provider.Contains("ConsoleLoggerProvider")
                        && category.Contains("Controller")
                        && logLevel >= LogLevel.Information)
                    {
                        return true;
                    }
                    else if (provider.Contains("ConsoleLoggerProvider")
                        && category.Contains("Microsoft")
                        && logLevel >= LogLevel.Information)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                });
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Kode sebelumnya menampilkan log konsol jika kategori berisi Controller atau Microsoft dan tingkat log adalah Information atau yang lebih tinggi.

Umumnya, tingkat log harus ditentukan dalam konfigurasi dan bukan kode.

ASP.NET Core dan EF Core kategori

Tabel berikut berisi beberapa kategori yang digunakan oleh ASP.NET Core dan Entity Framework Core, dengan catatan tentang log:

Kategori Catatan
Microsoft.AspNetCore Diagnostik ASP.NET Core umum.
Microsoft.AspNetCore.DataProtection Kunci mana yang dipertimbangkan, ditemukan, dan digunakan.
Microsoft.AspNetCore.HostFiltering Host diizinkan.
Microsoft.AspNetCore.Hosting Waktu yang diperlukan untuk menyelesaikan permintaan HTTP dan jam berapa dimulainya. Rakitan startup hosting mana yang dimuat.
Microsoft.AspNetCore.Mvc MVC dan diagnostik Razor. Pengikatan model, eksekusi filter, kompilasi tampilan, pemilihan tindakan.
Microsoft.AspNetCore.Routing Informasi pencocokan rute.
Microsoft.AspNetCore.Server Respons koneksi dimulai, berhenti, dan tetap aktif. Informasi sertifikat HTTPS.
Microsoft.AspNetCore.StaticFiles File yang disajikan.
Microsoft.EntityFrameworkCore Diagnostik Entity Framework Core Umum. Aktivitas dan konfigurasi database, deteksi perubahan, migrasi.

Untuk melihat kategori lainnya di jendela konsol, atur appsettings.Development.json menjadi berikut ini:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Trace",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}

Cakupan log

Cakupan dapat mengelompokkan serangkaian operasi logis. Pengelompokan ini dapat digunakan untuk melampirkan data yang sama ke setiap log yang dibuat sebagai bagian dari kumpulan. Misalnya, setiap log yang dibuat sebagai bagian dari pemrosesan transaksi dapat menyertakan ID transaksi.

Cakupan:

Penyedia berikut mendukung cakupan:

Gunakan cakupan dengan membungkus panggilan pencatat di blok using:

[HttpGet("{id}")]
public async Task<ActionResult<TodoItemDTO>> GetTodoItem(long id)
{
    TodoItem todoItem;
    var transactionId = Guid.NewGuid().ToString();
    using (_logger.BeginScope(new List<KeyValuePair<string, object>>
        {
            new KeyValuePair<string, object>("TransactionId", transactionId),
        }))
    {
        _logger.LogInformation(MyLogEvents.GetItem, "Getting item {Id}", id);

        todoItem = await _context.TodoItems.FindAsync(id);

        if (todoItem == null)
        {
            _logger.LogWarning(MyLogEvents.GetItemNotFound, 
                "Get({Id}) NOT FOUND", id);
            return NotFound();
        }
    }

    return ItemToDTO(todoItem);
}

Penyedia pengelogan bawaan

ASP.NET Core menyertakan penyedia pengelogan berikut sebagai bagian dari kerangka kerja bersama:

Penyedia pengelogan berikut dikirimkan oleh Microsoft, tetapi bukan sebagai bagian dari kerangka kerja bersama. Penyedia ini harus dipasang sebagai nuget tambahan.

ASP.NET Core tidak menyertakan penyedia pengelogan untuk menulis log ke file. Untuk menulis log ke file dari aplikasi ASP.NET Core, pertimbangkan untuk menggunakan penyedia pengelogan pihak ketiga.

Untuk informasi tentang pengelogan stdout dan debug dengan ASP.NET Core Module, lihat Memecahkan Masalah ASP.NET Core di Azure App Service dan IIS dan ASP.NET Core Module (ANCM) untuk IIS.

Konsol

Penyedia Console mencatat output ke konsol. Untuk informasi lebih lanjut tentang melihat log Console dalam pengembangan, lihat Mencatat output dari eksekusi dotnet dan Visual Studio .

Debug

Penyedia Debug menulis output log dengan menggunakan kelas System.Diagnostics.Debug. Panggilan untuk System.Diagnostics.Debug.WriteLine menulis ke penyedia Debug.

Di Linux, lokasi log penyedia Debug bergantung pada distribusi dan mungkin salah satu dari berikut ini:

  • /var/log/message
  • /var/log/syslog

Sumber Kejadian

Penyedia EventSource menulis ke sumber kejadian lintas platform dengan nama Microsoft-Extensions-Logging. Di Windows, penyedia menggunakan ETW.

alat pelacakan jejak dotnet

Alat dotnet-trace adalah alat global CLI lintas platform yang memungkinkan pengumpulan jejak .NET Core dari proses yang berjalan. Alat ini mengumpulkan data penyedia Microsoft.Extensions.Logging.EventSource menggunakan LoggingEventSource.

Lihat dotnet-trace untuk petunjuk penginstalan.

Gunakan alat pelacakan jejak dotnet untuk mengumpulkan jejak dari aplikasi:

  1. Jalankan aplikasi dengan perintah dotnet run.

  2. Tentukan pengidentifikasi proses (PID) dari aplikasi .NET Core:

    dotnet trace ps
    

    Temukan PID untuk proses yang memiliki nama yang sama dengan rakitan aplikasi.

  3. Jalankan perintah dotnet trace.

    Sintaks perintah umum:

    dotnet trace collect -p {PID} 
        --providers Microsoft-Extensions-Logging:{Keyword}:{Provider Level}
            :FilterSpecs=\"
                {Logger Category 1}:{Category Level 1};
                {Logger Category 2}:{Category Level 2};
                ...
                {Logger Category N}:{Category Level N}\"
    

    Saat menggunakan shell perintah PowerShell, apit nilai --providers dalam tanda kutip tunggal ('):

    dotnet trace collect -p {PID} 
        --providers 'Microsoft-Extensions-Logging:{Keyword}:{Provider Level}
            :FilterSpecs=\"
                {Logger Category 1}:{Category Level 1};
                {Logger Category 2}:{Category Level 2};
                ...
                {Logger Category N}:{Category Level N}\"'
    

    Pada platform non-Windows, tambahkan opsi -f speedscope untuk mengubah format file jejak output menjadi speedscope.

    Tabel berikut mendefinisikan Kata Kunci:

    Kata kunci Deskripsi
    1 Catat peristiwa meta tentang LoggingEventSource. Tidak mencatat peristiwa dari ILogger.
    2 Mengaktifkan peristiwa Message saat ILogger.Log() dipanggil. Memberikan informasi dengan cara terprogram (tidak diformat).
    4 Mengaktifkan peristiwa FormatMessage saat ILogger.Log() dipanggil. Menyediakan informasi versi string yang diformat.
    8 Mengaktifkan peristiwa MessageJson saat ILogger.Log() dipanggil. Memberikan representasi JSON argumen.

    Tabel berikut mencantumkan tingkat penyedia:

    Tingkat Penyedia Deskripsi
    0 LogAlways
    1 Critical
    2 Error
    3 Warning
    4 Informational
    5 Verbose

    Penguraian untuk tingkat kategori dapat berupa string atau angka:

    Kategori bernama nilai Nilai numerik
    Trace 0
    Debug 1
    Information 2
    Warning 3
    Error 4
    Critical 5

    Tingkat penyedia dan tingkat kategori:

    • Berada dalam urutan terbalik.
    • Tidak semua konstanta string identik.

    Jika tidak ada FilterSpecs yang ditentukan, maka implementasi EventSourceLogger mencoba mengonversi tingkat penyedia ke tingkat kategori dan menerapkannya ke semua kategori.

    Tingkat Penyedia Tingkat Kategori
    Verbose(5) Debug(1)
    Informational(4) Information(2)
    Warning(3) Warning(3)
    Error(2) Error(4)
    Critical(1) Critical(5)

    Jika FilterSpecs disediakan, kategori apa pun yang disertakan dalam daftar menggunakan tingkat kategori yang dienkode di sana, semua kategori lainnya difilter.

    Contoh berikut mengasumsikan:

    • Aplikasi sedang berjalan dan memanggil logger.LogDebug("12345").
    • ID proses (PID) telah diatur melalui set PID=12345, di mana 12345 adalah PID yang sebenarnya.

    Pertimbangkan perintah berikut:

    dotnet trace collect -p %PID% --providers Microsoft-Extensions-Logging:4:5
    

    Perintah sebelumnya:

    • Mengambil pesan debug.
    • Tidak menerapkan FilterSpecs.
    • Menentukan tingkat 5 yang memetakan Debug kategori.

    Pertimbangkan perintah berikut:

    dotnet trace collect -p %PID%  --providers Microsoft-Extensions-Logging:4:5:\"FilterSpecs=*:5\"
    

    Perintah sebelumnya:

    • Tidak mengambil pesan debug karena tingkat kategori 5 adalah Critical.
    • Menyediakan FilterSpecs.

    Perintah berikut mengambil pesan debug karena kategori tingkat 1 menentukan Debug.

    dotnet trace collect -p %PID%  --providers Microsoft-Extensions-Logging:4:5:\"FilterSpecs=*:1\"
    

    Perintah berikut mengambil pesan debug karena kategori menentukan Debug.

    dotnet trace collect -p %PID%  --providers Microsoft-Extensions-Logging:4:5:\"FilterSpecs=*:Debug\"
    

    Entri FilterSpecs untuk {Logger Category} dan {Category Level} mewakili kondisi pemfilteran log tambahan. Pisahkan entri FilterSpecs dengan karakter titik koma ;.

    Contoh menggunakan shell perintah Windows:

    dotnet trace collect -p %PID% --providers Microsoft-Extensions-Logging:4:2:FilterSpecs=\"Microsoft.AspNetCore.Hosting*:4\"
    

    Perintah sebelumnya mengaktifkan:

    • Pencatat Sumber Kejadian untuk menghasilkan string yang diformat (4) untuk kesalahan (2).
    • Pengelogan Microsoft.AspNetCore.Hosting di tingkat pengelogan Informational (4).
  4. Hentikan alat pelacakan jejak dotnet dengan menekan tombol Enter atau Ctrl+C.

    Jejak disimpan dengan nama trace.nettrace di folder tempat perintah dotnet trace dijalankan.

  5. Buka jejak dengan Perfview. Buka file trace.nettrace dan jelajahi peristiwa pelacakan.

Jika aplikasi tidak membangun host dengan CreateDefaultBuilder, tambahkan penyedia Sumber Kejadian ke konfigurasi pengelogan aplikasi.

Untuk informasi selengkapnya, lihat:

Perfview

Gunakan utilitas PerfView untuk mengumpulkan dan melihat log. Ada alat lain untuk melihat log ETW, tetapi PerfView memberikan pengalaman terbaik untuk bekerja dengan peristiwa ETW yang dipancarkan oleh ASP.NET Core.

Untuk mengonfigurasi PerfView agar mengumpulkan peristiwa yang dicatat oleh penyedia ini, tambahkan string *Microsoft-Extensions-Logging ke daftar Penyedia Tambahan. Jangan lewatkan * di awal string.

EventLog Windows

Penyedia EventLog mengirimkan output log ke Log Peristiwa Windows. Tidak seperti penyedia lainnya, penyedia EventLogtidak mewarisi pengaturan non-penyedia default. Jika pengaturan log EventLog tidak ditentukan, pengaturan tersebut default ke LogLevel.Warning.

Untuk mencatat peristiwa yang lebih rendah dari LogLevel.Warning, atur tingkat log secara eksplisit. Contoh berikut mengatur tingkat log default Log Peristiwa ke LogLevel.Information:

"Logging": {
  "EventLog": {
    "LogLevel": {
      "Default": "Information"
    }
  }
}

Overload AddEventLog dapat meneruskan EventLogSettings. Jika null atau tidak ditentukan, pengaturan bawaan berikut akan digunakan:

  • LogName: "Aplikasi"
  • SourceName: ".NET Runtime"
  • MachineName: Nama komputer lokal yang digunakan.

Kode berikut mengubah SourceName dari nilai default ".NET Runtime" menjadi MyLogs:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging =>
            {
                logging.AddEventLog(eventLogSettings =>
                {
                    eventLogSettings.SourceName = "MyLogs"; 
                });
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Azure App Service

Paket penyedia Microsoft.Extensions.Logging.AzureAppServices menulis log ke file teks di sistem file aplikasi Azure App Service dan ke penyimpanan blob di akun Azure Storage.

Paket penyedia tidak disertakan dalam kerangka kerja bersama. Untuk menggunakan penyedia, tambahkan paket penyedia ke proyek.

Untuk mengonfigurasi pengaturan penyedia, gunakan AzureFileLoggerOptions dan AzureBlobLoggerOptions, seperti yang ditunjukkan pada contoh berikut:

public class Scopes
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().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>();
                });
    }
}

Saat disebarkan ke Azure App Service, aplikasi menggunakan pengaturan di bagian Log App Service pada halaman App Service di portal Azure. Saat pengaturan berikut diperbarui, perubahan akan langsung berlaku tanpa memerlukan mulai ulang atau penyebaran ulang aplikasi.

  • Pengelogan Aplikasi (Filesystem)
  • Pengelogan Aplikasi (Blob)

Lokasi default untuk file log ada di folder D:\home\LogFiles\Application, dan nama file defaultnya adalah diagnostics-yyyymmdd.txt. Batas ukuran file default adalah 10 MB, dan jumlah maksimum default file yang dipertahankan adalah 2. Nama blob default adalah {app-name}{timestamp}/yyyy/mm/dd/hh/{guid}-applicationLog.txt.

Penyedia ini hanya mencatat saat proyek berjalan di lingkungan Azure.

Azure log streaming

Azure log streaming mendukung melihat aktivitas log secara real time dari:

  • Server aplikasi
  • Server web
  • Pelacakan permintaan gagal

Untuk mengonfigurasi Azure log streaming:

  • Buka halaman Log App Service dari halaman portal aplikasi.
  • Atur Pengelogan Aplikasi (Filesystem) ke Aktif.
  • Pilih Tingkat log. Pengaturan ini hanya berlaku untuk Azure log streaming.

Buka halaman Aliran Log untuk melihat log. Pesan yang dicatat akan dicatat dengan antarmuka ILogger.

Azure Application Insights

Paket penyedia Microsoft.Extensions.Logging.ApplicationInsights menulis log ke Azure Application Insights. Application Insights adalah layanan yang memantau aplikasi web dan menyediakan alat untuk mengkueri dan menganalisis data telemetri. Jika menggunakan penyedia ini, Anda dapat membuat kueri dan menganalisis log menggunakan alat Application Insights.

Penyedia pengelogan disertakan sebagai dependensi Microsoft.ApplicationInsights.AspNetCore, yang merupakan paket yang menyediakan semua telemetri yang tersedia untuk ASP.NET Core. Jika Anda menggunakan paket ini, Anda tidak perlu memasang paket penyedia.

Paket Microsoft.ApplicationInsights.Web adalah untuk ASP.NET 4.x, bukan ASP.NET Core.

Untuk informasi selengkapnya, lihat sumber daya berikut:

Penyedia pengelogan pihak ketiga

Kerangka kerja pengelogan pihak ketiga yang berfungsi dengan ASP.NET Core:

Beberapa kerangka kerja pihak ketiga dapat melakukan pengelogan semantik, yang juga dikenal sebagai pengelogan terstruktur.

Menggunakan kerangka kerja pihak ketiga mirip dengan menggunakan salah satu penyedia bawaan:

  1. Tambahkan paket NuGet ke proyek Anda.
  2. Panggil metode ekstensi ILoggerFactory yang disediakan oleh kerangka kerja pengelogan.

Untuk informasi lebih lanjut, lihat dokumentasi masing-masing penyedia. Penyedia pengelogan pihak ketiga tidak didukung oleh Microsoft.

Aplikasi konsol non-host

Untuk contoh cara menggunakan Host Umum di aplikasi konsol non-web, lihat file Program.cs dari Sampel aplikasi Proses di Latar Belakang (Proses di latar belakang dengan layanan yang dihosting di ASP.NET Core).

Kode pengelogan untuk aplikasi tanpa Host Umum berbeda dalam cara penyedia ditambahkan dan pencatat dibuat.

Penyedia pengelogan

Di aplikasi konsol non-host, panggil metode ekstensi Add{provider name} penyedia saat membuat LoggerFactory:

class Program
{
    static void Main(string[] args)
    {
        using 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");
    }
}

Membuat log

Untuk membuat log, gunakan objek ILogger<TCategoryName>. Gunakan LoggerFactory untuk membuat ILogger.

Contoh berikut membuat pencatat dengan LoggingConsoleApp.Program sebagai kategorinya.

class Program
{
    static void Main(string[] args)
    {
        using 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");
    }
}

Dalam contoh berikut, pencatat digunakan untuk membuat log dengan Information sebagai tingkatnya. Tingkat log menunjukkan tingkat keparahan peristiwa yang dicatat.

class Program
{
    static void Main(string[] args)
    {
        using 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");
    }
}

Tingkat dan kategori dijelaskan secara lebih rinci dalam dokumentasi ini.

Mencatat selama konstruksi host

Pengelogan selama konstruksi host tidak didukung secara langsung. Namun, pencatat terpisah dapat digunakan. Dalam contoh berikut, pencatat Serilog digunakan untuk mencatat di CreateHostBuilder. AddSerilog menggunakan konfigurasi statis yang ditentukan dalam Log.Logger:

using System;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        var builtConfig = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddCommandLine(args)
            .Build();

        Log.Logger = new LoggerConfiguration()
            .WriteTo.Console()
            .WriteTo.File(builtConfig["Logging:FilePath"])
            .CreateLogger();

        try
        {
            return Host.CreateDefaultBuilder(args)
                .ConfigureServices((context, services) =>
                {
                    services.AddRazorPages();
                })
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    config.AddConfiguration(builtConfig);
                })
                .ConfigureLogging(logging =>
                {   
                    logging.AddSerilog();
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Host builder error");

            throw;
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }
}

Mengonfigurasi layanan yang bergantung pada ILogger

Injeksi konstruktor pencatat ke Startup berfungsi di versi ASP.NET Core sebelumnya karena kontainer DI terpisah dibuat untuk Host Web. Untuk informasi tentang mengapa hanya satu kontainer yang dibuat untuk Host Umum, lihat pengumuman perubahan disruptif.

Untuk mengonfigurasi layanan yang bergantung pada ILogger<T>, gunakan injeksi konstruktor atau berikan metode pabrik. Pendekatan metode pabrik disarankan hanya jika tidak ada pilihan lain. Misalnya, pertimbangkan layanan yang memerlukan instans ILogger<T> yang disediakan oleh 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 };
    });
}

Kode yang disorot sebelumnya adalah Func<T,TResult> yang dijalankan saat pertama kali kontainer DI perlu membuat instans MyService. Anda dapat mengakses semua layanan terdaftar dengan cara ini.

Membuat log di Utama

Kode berikut mencatat di Main dengan mendapatkan instans ILogger dari DI setelah membangun host:

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

    var logger = host.Services.GetRequiredService<ILogger<Program>>();
    logger.LogInformation("Host created.");

    host.Run();
}

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

Membuat log di Startup

Kode berikut menulis log di Startup.Configure:

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

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

    app.UseRouting();

    app.UseAuthorization();

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

Menulis log sebelum menyelesaikan penyiapan kontainer DI dalam metode Startup.ConfigureServices tidak didukung:

  • Injeksi pencatat ke dalam konstruktor Startup tidak didukung.
  • Injeksi pencatat ke dalam tanda tangan metode Startup.ConfigureServices tidak didukung

Alasan pembatasan ini adalah karena pengelogan bergantung pada DI dan pada konfigurasi, yang bergantung pada DI. Kontainer DI tidak disiapkan hingga ConfigureServices selesai.

Untuk informasi tentang mengonfigurasi layanan yang bergantung pada ILogger<T> atau mengapa injeksi konstruktor pencatat ke Startup berfungsi di versi sebelumnya, lihat Mengonfigurasi layanan yang bergantung pada ILogger

Tidak ada metode pencatat asinkron

Pengelogan harus dilakukan dengan sangat cepat sehingga tidak sebanding dengan biaya performa dari kode asinkron. Jika penyimpanan data pengelogan lambat, jangan langsung menulisnya. Pertimbangkan untuk terlebih dahulu menulis pesan log ke penyimpanan cepat, lalu memindahkannya ke penyimpanan lambat nanti. Misalnya, saat mencatat ke SQL Server, jangan lakukan secara langsung dalam metode Log, karena metode Log bersifat sinkron. Sebagai gantinya, tambahkan pesan log secara sinkron ke antrean dalam memori dan minta pekerja latar belakang untuk menarik pesan keluar dari antrean untuk melakukan pekerjaan asinkron berupa mendorong data ke SQL Server. Untuk informasi lebih lanjut, lihat masalah GitHub ini.

Mengubah tingkat log di aplikasi yang sedang berjalan

Logging API tidak menyertakan skenario untuk mengubah tingkat log saat aplikasi sedang berjalan. Namun, beberapa penyedia konfigurasi mampu untuk memuat ulang konfigurasi, yang langsung berpengaruh pada konfigurasi pengelogan. Misalnya, Penyedia Konfigurasi File, memuat ulang konfigurasi pengelogan secara default. Jika konfigurasi diubah dalam kode saat aplikasi sedang berjalan, aplikasi dapat memanggil IConfigurationRoot.Reload untuk memperbarui konfigurasi pengelogan aplikasi.

ILogger dan ILoggerFactory

Antarmuka dan implementasi ILogger<TCategoryName> dan ILoggerFactory disertakan dalam .NET Core SDK. Mereka juga tersedia dalam paket NuGet berikut:

Menerapkan aturan filter log dalam kode

Pendekatan yang lebih disukai untuk menyetel aturan filter log adalah dengan menggunakan Konfigurasi.

Contoh berikut menunjukkan cara mendaftarkan aturan filter dalam kode:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging =>
               logging.AddFilter("System", LogLevel.Debug)
                  .AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Information)
                  .AddFilter<ConsoleLoggerProvider>("Microsoft", LogLevel.Trace))
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

logging.AddFilter("System", LogLevel.Debug) menentukan kategori System dan Debug tingkat log. Filter diterapkan ke semua penyedia karena penyedia tertentu tidak dikonfigurasi.

AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Information) menentukan:

  • Penyedia pengelogan Debug.
  • Tingkat log Information dan lebih tinggi.
  • Semua kategori dimulai dengan "Microsoft".

Secara otomatis mencatat cakupan dengan SpanId, TraceId, dan ParentId

Pustaka pengelogan secara implisit membuat objek cakupan dengan SpanId, TraceId, dan ParentId. Perilaku ini dikonfigurasi melalui ActivityTrackingOptions.

  var loggerFactory = LoggerFactory.Create(logging =>
  {
      logging.Configure(options =>
      {
          options.ActivityTrackingOptions = ActivityTrackingOptions.SpanId
                                              | ActivityTrackingOptions.TraceId
                                              | ActivityTrackingOptions.ParentId;
      }).AddSimpleConsole(options =>
      {
          options.IncludeScopes = true;
      });
  });

Jika header permintaan http traceparent diatur, ParentId dalam cakupan log menunjukkan parent-id W3C dari header traceparent masuk dan SpanId dalam cakupan log menunjukkan parent-id yang diperbarui untuk langkah/rentang keluar berikutnya. Untuk informasi lebih lanjut, lihat Mengubah Bidang traceparent.

Membuat pencatat kustom

Untuk membuat pencatat kustom, lihat Mengimplementasikan penyedia pengelogan kustom di .NET.

Sumber Daya Tambahan: