.NET Core ve ASP.NET Core'da günlük

Kirk Larkabağı, Juergen Gutsch ve Rick Anderson

.NET Core, çeşitli yerleşik ve üçüncü taraf oturum açma sağlayıcılarıyla birlikte çalışarak bir günlüğe kaydetme API 'sini destekler. Bu makalede, yerleşik sağlayıcılarla günlüğe kaydetme API 'sinin nasıl kullanılacağı gösterilmektedir.

Bu makalede gösterilen kod örneklerinin çoğu ASP.NET Core uygulamalardan oluşur. Bu kod parçacıklarının günlüğe kaydetmeye özgü bölümleri, genel ana bilgisayarıkullanan tüm .NET Core uygulamaları için geçerlidir. ASP.NET Core Web uygulaması şablonları genel Konağı kullanır.

Örnek kodu görüntüleme veya indirme (nasıl indirileceği)

Günlüğe kaydetme sağlayıcıları

Günlükleri görüntüleyen sağlayıcı dışında günlüğe kaydetme sağlayıcıları mağaza günlükleri Console . Örneğin, Azure Application Insights sağlayıcısı günlükleri Azure Application Insights depolar. Birden çok sağlayıcı etkinleştirilebilir.

Varsayılan ASP.NET Core Web uygulaması şablonları:

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

Yukarıdaki kod, Program ASP.NET Core Web uygulaması şablonlarıyla oluşturulan sınıfı gösterir. Sonraki birkaç bölüm, genel ana bilgisayarı kullanan ASP.NET Core Web uygulaması şablonlarına göre örnekler sağlar. Konak olmayan konsol uygulamaları bu belgenin ilerleyen kısımlarında ele alınmıştır.

Tarafından eklenen varsayılan günlük sağlayıcıları kümesini geçersiz kılmak için Host.CreateDefaultBuilder ClearProviders gerekli günlük sağlayıcılarını çağırın ve ekleyin. Örneğin, aşağıdaki kod:

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

Ek sağlayıcılar için bkz.:

Günlükleri oluştur

Günlükler oluşturmak için ILogger<TCategoryName> bağımlılık ekleme (dı) öğesinden bir nesne kullanın.

Aşağıdaki örnek:

  • ILogger<AboutModel>Türün tam adı olan bir günlük kategorisini kullanan bir günlükçü oluşturur AboutModel . Günlük kategorisi, her günlük ile ilişkili bir dizedir.
  • Bu LogInformation düzeyde günlüğe kaydedilecek çağrılar Information . Günlük düzeyi günlüğe kaydedilen etkinliğin önem derecesini gösterir.
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);
    }
}

Düzeyler ve Kategoriler bu belgenin ilerleyen bölümlerinde daha ayrıntılı açıklanmıştır.

Hakkında bilgi için Blazor , bkz. bu belgede Günlükler Blazor Blazor WebAssembly oluşturma .

Ana ve başlangıçta Günlükler oluşturma , ve ' de günlüklerin nasıl oluşturulacağını Main gösterir Startup .

Günlüğe kaydetmeyi yapılandırma

Günlüğe kaydetme yapılandırması genellikle Logging appSettings'in bölümü tarafından sağlanır. {Environment} . JSON dosyaları. Dosyasında aşağıdaki appsettings.Development.js ASP.NET Core Web uygulaması şablonları tarafından oluşturulur:

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

Önceki JSON 'da:

  • "Default", "Microsoft" Ve "Microsoft.Hosting.Lifetime" kategorileri belirtilir.
  • "Microsoft"Kategori, ile başlayan tüm kategoriler için geçerlidir "Microsoft" . Örneğin, bu ayar kategori için geçerlidir "Microsoft.AspNetCore.Routing.EndpointMiddleware" .
  • "Microsoft"Günlük düzeyindeki Warning ve daha yüksek kategori günlükleri.
  • Kategori kategorisinden "Microsoft.Hosting.Lifetime" daha özeldir "Microsoft" , bu nedenle "Microsoft.Hosting.Lifetime" Kategori "Information" ve üzeri günlük düzeyinde günlüğe kaydedilir.
  • Belirli bir günlük sağlayıcısı belirtilmedi, bu nedenle LogLevel Windows olaygünlüğü hariç tüm etkin günlük sağlayıcıları için geçerlidir.

LoggingÖzelliği LogLevel ve günlük sağlayıcısı özelliklerine sahip olabilir. LogLevelSeçili kategoriler için günlüğe kaydedilecek en düşük düzeyi belirtir. Önceki JSON 'da Information ve Warning günlük düzeyleri belirtilmiştir. LogLevelGünlüğün önem derecesini ve 0 ile 6 arasındaki aralıkları belirtir:

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

Bir LogLevel belirtildiğinde, belirtilen düzeydeki ve daha yüksek iletiler için günlüğe kaydetme etkinleştirilir. Önceki JSON 'da Default Kategori, ve üzeri için günlüğe kaydedilir Information . Örneğin,, Information , Warning Error ve Critical iletileri günlüğe kaydedilir. Hayır LogLevel belirtilmemişse, günlüğe kaydetme varsayılan olarak Information düzeydir. Daha fazla bilgi için bkz. günlük düzeyleri.

Sağlayıcı özelliği, bir özelliği belirtebilir LogLevel . LogLevelsağlayıcı altında, bu sağlayıcının günlüğe kaydedilecek düzeyleri belirtir ve sağlayıcı olmayan günlük ayarlarını geçersiz kılar. Dosyasında aşağıdaki appsettings.js göz önünde bulundurun:

{
  "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.
      }
    }
  }
}

Logging.{providername}.LogLevel' Deki geçersiz kılma ayarlarındaki ayarlar Logging.LogLevel . Önceki JSON 'da, Debug sağlayıcının varsayılan günlük düzeyi şu şekilde ayarlanır Information :

Logging:Debug:LogLevel:Default:Information

Yukarıdaki ayar, Information hariç her kategori için günlük düzeyini belirtir Logging:Debug: Microsoft.Hosting . Belirli bir kategori listelendiğinde, belirtilen kategori varsayılan kategoriyi geçersiz kılar. Önceki JSON 'da Logging:Debug:LogLevel Kategoriler "Microsoft.Hosting" ve "Default" içindeki ayarları geçersiz kılınLogging:LogLevel

En düşük günlük düzeyi şu şekilde belirtilebilir:

  • Belirli sağlayıcılar: Örneğin,Logging:EventSource:LogLevel:Default:Information
  • Belirli Kategoriler: Örneğin,Logging:LogLevel:Microsoft:Warning
  • Tüm sağlayıcılar ve tüm Kategoriler:Logging:LogLevel:Default:Warning

Minimum düzeyin altındaki tüm Günlükler şu değildir:

  • Sağlayıcıya geçirildi.
  • Günlüğe kaydedilir veya gösterilir.

Tüm günlükleri gizlemek için LogLevel. Nonebelirtin. LogLevel.None6 değerine sahiptir LogLevel.Critical (5).

Bir sağlayıcı, günlük kapsamlarınıdestekliyorsa, etkinleştirilip etkinleştirilmeyeceğini IncludeScopes belirtir. Daha fazla bilgi için bkz. günlük kapsamları

Aşağıdaki appsettings.js dosyası varsayılan olarak etkinleştirilen tüm sağlayıcıları içerir:

{
  "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"
      }
    }
  }
}

Yukarıdaki örnekte:

  • Kategoriler ve düzeyler önerilen değerler değildir. Varsayılan tüm sağlayıcıları göstermek için örnek sağlanır.
  • Logging.{providername}.LogLevel' Deki geçersiz kılma ayarlarındaki ayarlar Logging.LogLevel . Örneğin, içindeki düzeyi Debug.LogLevel.Default içindeki düzeyi geçersiz kılar LogLevel.Default .
  • Her varsayılan sağlayıcı diğer adı kullanılır. Her sağlayıcı, tam nitelikli tür adı yerine yapılandırmada kullanılabilecek bir diğer ad tanımlar. Yerleşik sağlayıcılar diğer adları şunlardır:
    • Konsol
    • Hata ayıklama
    • EventSource
    • EventLog
    • AzureAppServicesFile
    • AzureAppServicesBlob
    • ApplicationInsights

Günlük düzeyini komut satırı, ortam değişkenleri ve diğer yapılandırma ile ayarlama

Günlük düzeyi herhangi bir yapılandırma sağlayıcısındanayarlanabilir.

Ayırıcı, : tüm platformlarda ortam değişkeni hiyerarşik anahtarlarla birlikte çalışmaz. __çift alt çizgi şöyledir:

  • Tüm platformlar tarafından de destekler. Örneğin, : ayıracı Bash tarafından desteklanmaz,ancak __ bu şekildedir.
  • Otomatik olarak bir ile değiştirilir :

Aşağıdaki komutlar:

  • Ortam anahtarını Logging:LogLevel:Microsoft Windows üzerinde bir değeri olarak ayarlayın Information .
  • ASP.NET Core Web uygulaması şablonlarıyla oluşturulan bir uygulama kullanırken ayarları test edin. dotnet runKomutun kullanıldıktan sonra proje dizininde çalıştırılması gerekir set .
set Logging__LogLevel__Microsoft=Information
dotnet run

Önceki ortam ayarı:

  • Yalnızca ' de ayarlanan komut penceresinden başlatılan işlemlerde ayarlanır.
  • Visual Studio ile başlatılan tarayıcılarda okunamaz.

Aşağıdaki Setx komutu, Windows 'daki ortam anahtarını ve değerini de ayarlar. Farklı olarak set , setx ayarlar kalıcı hale getirilir. /MAnahtar, değişkeni sistem ortamında ayarlar. /MKullanılmazsa, bir kullanıcı ortam değişkeni ayarlanır.

setx Logging__LogLevel__Microsoft=Information /M

Azure App Service, Ayarlar > yapılandırma sayfasında Yeni uygulama ayarı ' nı seçin. Azure App Service uygulama ayarları şunlardır:

  • Rest 'de şifrelenir ve şifreli bir kanal üzerinden iletilir.
  • Ortam değişkenleri olarak sunulur.

Daha fazla bilgi için bkz. Azure uygulamaları: Azure portalını kullanarak uygulama yapılandırmasını geçersiz kılma.

Ortam değişkenlerini kullanarak ASP.NET Core yapılandırma değerlerini ayarlama hakkında daha fazla bilgi için bkz. ortam değişkenleri. Komut satırı, Azure Key Vault, Azure Uygulama yapılandırması, diğer dosya biçimleri ve daha fazlası dahil diğer yapılandırma kaynaklarını kullanma hakkında bilgi için bkz ASP.NET Core'de yapılandırma ..

Filtreleme kuralları nasıl uygulanır

Bir ILogger<TCategoryName> nesne oluşturulduğunda, ILoggerFactory nesne bu günlükçü için uygulanacak her sağlayıcı için tek bir kural seçer. Bir örnek tarafından yazılan tüm iletiler ILogger , seçilen kurallara göre filtrelenmiştir. Her sağlayıcı ve kategori çifti için en özel kural, kullanılabilir kurallardan seçilir.

Belirli bir kategori için oluşturulan her sağlayıcı için aşağıdaki algoritma kullanılır ILogger :

  • Sağlayıcı veya diğer adıyla eşleşen tüm kuralları seçin. Hiçbir eşleşme bulunmazsa, boş bir sağlayıcıya sahip tüm kurallar ' ı seçin.
  • Önceki adımın sonucunda, en uzun eşleşen kategori ön ekine sahip kurallar ' ı seçin. Eşleşme bulunmazsa, kategori belirtmeyen tüm kuralları seçin.
  • Birden çok kural seçilirse, son olanı götürün.
  • Hiçbir kural seçilmezse, kullanın MinimumLevel .

DotNet Run ve Visual Studio 'dan çıktıyı günlüğe kaydetme

Varsayılan günlük oluşturma sağlayıcılarıyla oluşturulan Günlükler görüntülenir:

  • Visual Studio’da
    • Hata ayıklama sırasında hata ayıkla çıkış penceresinde.
    • ASP.NET Core Web sunucusu penceresinde.
  • Konsol penceresinde, uygulama ile birlikte çalıştırıldığında dotnet run .

"Microsoft" kategorileri ile başlayan Günlükler ASP.NET Core Framework kodundan alınır. ASP.NET Core ve uygulama kodu aynı günlük API 'sini ve sağlayıcılarını kullanır.

Günlük kategorisi

Bir ILogger nesne oluşturulduğunda, bir Kategori belirtilir. Bu kategori, bu örneği tarafından oluşturulan her günlük iletisine dahildir ILogger . Kategori dizesi rastgele, ancak kural sınıf adını kullanmaktır. Örneğin, bir denetleyicide adı olabilir "TodoApi.Controllers.TodoController" . ASP.NET Core Web Apps, ILogger<T> ILogger Kategori olarak tam nitelikli tür adını kullanan bir örneği otomatik olarak almak için kullanır T :

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

Kategoriyi açıkça belirtmek için şunu çağırın ILoggerFactory.CreateLogger :

public class ContactModel : PageModel
{
    private readonly ILogger _logger;

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

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

ILogger<T>, CreateLogger tam nitelikli tür adı ile çağırma ile eşdeğerdir T .

Günlük düzeyi

Aşağıdaki tabloda LogLevel değerler, kolaylık Log{LogLevel} genişletme yöntemi ve önerilen kullanım listelenmektedir:

LogLevel Değer Yöntem Açıklama
İzleme 0 LogTrace En ayrıntılı iletileri içerir. Bu iletilerde hassas uygulama verileri bulunabilir. Bu iletiler varsayılan olarak devre dışıdır ve üretimde etkinleştirilmemelidir.
Hata ayıklama 1 LogDebug Hata ayıklama ve geliştirme için. Yüksek hacimden dolayı üretimde dikkatli olarak kullanın.
Bilgi 2 LogInformation Uygulamanın genel akışını izler. Uzun süreli bir değere sahip olabilir.
Uyarı 3 LogWarning Olağandışı veya beklenmeyen olaylar için. Genellikle, uygulamanın başarısız olmasına neden olmayan hataları veya koşulları içerir.
Hata 4 LogError İşlenemeyen hatalar ve özel durumlar için. Bu iletiler, uygulama genelinde bir hata değil, geçerli işlemde veya istekte bir hata olduğunu gösterir.
Kritik 5 LogCritical Anında ilgilenilmesi gereken hatalarda. Örnekler: veri kaybı senaryoları, disk alanı yetersiz.
Hiçbiri 6 Günlüğe kaydetme kategorisinin herhangi bir ileti yazmamalıdır.

Önceki tabloda, LogLevel En düşük önem derecesine göre listelenmiştir.

Günlük yönteminin ilk parametresi, LogLevel Günlüğün önem derecesini gösterir. Çağırmak yerine Log(LogLevel, ...) , çoğu Geliştirici günlük {LogLevel} uzantı yöntemlerini çağırır. Log{LogLevel}Uzantı yöntemleri günlük yöntemini çağırır ve LogLevel değerini belirtir. Örneğin, aşağıdaki iki günlük çağrısı işlevsel olarak eşdeğerdir ve aynı günlüğü üretir:

[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.TestItemolay KIMLIĞIDIR. MyLogEvents, örnek uygulamanın bir parçasıdır ve günlük olay kimliği bölümünde görüntülenir.

Mydisplayrouteınfo ve ToCtxString Rick.Docs. Samples. routeınfo NuGet paketi tarafından sağlanır. Yöntemler Controller yol bilgilerini görüntüler.

Aşağıdaki kod oluşturur Information ve Warning günlükleri:

[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);
}

Yukarıdaki kodda, ilk Log{LogLevel} parametresi MyLogEvents.GetItem günlük olay kimliğidir. İkinci parametre, kalan Yöntem parametreleri tarafından belirtilen bağımsız değişken değerleri için yer tutucuları olan bir ileti şablonudur. Yöntem parametreleri bu belgenin ilerleyen kısımlarında bulunan ileti şablonu bölümünde açıklanmaktadır.

Log{LogLevel}Belirli bir depolama ortamına ne kadar günlük çıktısı yazıldığını denetlemek için uygun yöntemi çağırın. Örneğin:

  • Üretimde:
    • Veya düzeylerinde günlüğe kaydetme, Trace Information yüksek hacimli ayrıntılı günlük iletileri oluşturur. Maliyetleri denetlemek ve veri depolama sınırlarını aşmamak için, Trace Information iletileri yüksek hacimli ve düşük maliyetli bir veri deposuna günlüğe kaydedin. TraceBelirli kategorileri ve sınırlamayı değerlendirin Information .
    • Düzeylerde oturum açma, Warning Critical birkaç günlük iletisi üretmelidir.
      • Maliyetler ve depolama sınırları genellikle bir sorun değildir.
      • Birkaç günlük veri deposu seçimlerine daha fazla esneklik sağlar.
  • Geliştirme aşamasında:
    • Warning olarak ayarlayın.
    • Trace Information Sorun giderirken veya ileti ekleyin. Çıktıyı sınırlandırmak için, Trace Information yalnızca araştırma bölümündeki Kategoriler için ayarlayın.

ASP.NET Core çerçeve olayları için günlükleri yazar. Örneğin, için günlük çıktısını göz önünde bulundurun:

  • RazorASP.NET Core şablonlarıyla oluşturulan bir sayfalar uygulaması.
  • Günlük kayıt kümesiLogging:Console:LogLevel:Microsoft:Information
  • Gizlilik sayfasına gidilme:
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

Aşağıdaki JSON kümeleri Logging:Console:LogLevel:Microsoft:Information :

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

Günlüğe olay KIMLIĞI

Her günlük bir olay kimliğibelirtebilir. Örnek uygulama, MyLogEvents olay kimliklerini tanımlamak için sınıfını kullanır:

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

Olay KIMLIĞI bir olay kümesini ilişkilendirir. Örneğin, bir sayfadaki öğelerin listesini görüntülemek için ilgili tüm Günlükler 1001 olabilir.

Günlüğe kaydetme sağlayıcısı, olay KIMLIĞINI günlüğe kaydetme iletisindeki kimlik alanında veya hiç değil, bir kimlik alanında saklayabilir. Hata ayıklama sağlayıcısı olay kimliklerini göstermiyor. Konsol sağlayıcısı, etkinlik kimliklerini kategoriden sonra parantez içinde gösterir:

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

Bazı günlük sağlayıcıları olay KIMLIĞINI bir alanda depolar, bu da KIMLIĞE filtrelemeye olanak tanır.

Günlük iletisi şablonu

Her günlük API 'SI bir ileti şablonu kullanır. İleti şablonu, bağımsız değişkenlerin sağlandığı yer tutucuları içerebilir. Sayılar değil, yer tutucular için adları kullanın.

[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);
}

Adlarının, değerlerinin sağlanması için hangi parametrelerin kullanılacağını belirleyen yer tutucular sırası. Aşağıdaki kodda, parametre adları ileti şablonunda sıra dışında:

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

Yukarıdaki kod, sırasıyla parametre değerleriyle bir günlük iletisi oluşturur:

Parameter values: param1, param2

Bu yaklaşım, günlük sağlayıcılarının anlam veya yapılandırılmış günlük kaydıuygulamasına olanak sağlar. Bağımsız değişkenler yalnızca biçimli ileti şablonuna değil, günlük sistemine geçirilir. Bu, günlük sağlayıcılarının parametre değerlerini alan olarak depolamasına olanak sağlar. Örneğin, aşağıdaki günlükçü yöntemini göz önünde bulundurun:

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

Örneğin, Azure Tablo depolama alanına oturum açarken:

  • Her Azure Tablo varlığı ID ve özellikleri olabilir RequestTime .
  • Özellikleri olan tablolar günlüğe kaydedilen verilerde sorguları basitleştirir. Örneğin, bir sorgu belirli bir aralıktaki tüm günlükleri, RequestTime kısa mesajdaki zaman aşımını ayrıştırmadan bulabilir.

Günlük özel durumları

Günlükçü yöntemlerinde bir özel durum parametresi alan aşırı yüklemeleri var:

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

Mydisplayrouteınfo ve ToCtxString Rick.Docs. Samples. routeınfo NuGet paketi tarafından sağlanır. Yöntemler Controller yol bilgilerini görüntüler.

Özel durum günlüğe kaydetme, sağlayıcıya özgüdür.

Varsayılan günlük düzeyi

Varsayılan günlük düzeyi ayarlanmamışsa varsayılan günlük düzeyi değeri olur Information .

Örneğin, aşağıdaki Web uygulamasını göz önünde bulundurun:

  • ASP.NET Web uygulaması şablonlarıyla oluşturulur.
  • appsettings.js ve appsettings.Development.js silinmiş ya da yeniden adlandırıldı.

Önceki kurulumla, gizlilik veya giriş sayfasına gidildiğinde Trace Debug Kategori adında birçok, ve Information ile ileti üretilir Microsoft .

Aşağıdaki kod, varsayılan günlük düzeyi yapılandırmada ayarlanmamışsa varsayılan günlük düzeyini ayarlar:

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

Genellikle, kod değil yapılandırmada günlük düzeyleri belirtilmelidir.

Filter işlevi

Configuration veya Code tarafından kendisine atanmış kuralları olmayan tüm sağlayıcılar ve kategoriler için bir filtre işlevi çağrılır:

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

Önceki kod, kategori içerdiğinde Controller veya Microsoft ve günlük düzeyi Information veya daha yüksek olduğunda konsol günlüklerini görüntüler.

Genellikle, kod değil yapılandırmada günlük düzeyleri belirtilmelidir.

ASP.NET Core ve EF Core kategorileri

Aşağıdaki tabloda, ASP.NET Core ve Entity Framework Core tarafından kullanılan ve Günlükler hakkındaki notlarla ilgili bazı kategoriler yer almaktadır:

Kategori Notlar
Microsoft.AspNetCore Genel ASP.NET Core tanılama.
Microsoft.AspNetCore.DataProtection Hangi anahtarların kabul edildiği, bulunduğu ve kullanıldığı.
Microsoft.AspNetCore.HostFiltering İzin verilen konaklar.
Microsoft.AspNetCore.Hosting HTTP isteklerinin tamamlanması için geçen süre ve ne zaman başladıkları. Hangi barındırma başlangıç derlemeleri yüklendi.
Microsoft.AspNetCore.Mvc MVC ve Razor Tanılama. Model bağlama, filtre yürütme, derlemeyi görüntüleme, eylem seçimi.
Microsoft.AspNetCore.Routing Eşleşen bilgileri yönlendirin.
Microsoft. AspNetCore. Server Bağlantı başlatın, durdurun ve canlı yanıtları koruyun. HTTPS sertifika bilgileri.
Microsoft.AspNetCore.StaticFiles Sunulan dosyalar.
Microsoft. EntityFrameworkCore Genel Entity Framework Core tanılama. Veritabanı etkinliği ve yapılandırması, değişiklik algılama, geçişler.

Konsol penceresinde daha fazla kategori görüntülemek için appsettings.Development.js aşağıdaki şekilde ayarlayın:

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

Günlük kapsamları

Kapsam bir mantıksal işlemler kümesini gruplandırabilir. Bu gruplandırma, kümenin bir parçası olarak oluşturulan her günlüğe aynı verileri eklemek için kullanılabilir. Örneğin, bir işlemin işlenmesi kapsamında oluşturulan her günlük işlem KIMLIĞI içerebilir.

Kapsam:

Aşağıdaki sağlayıcılar kapsamları destekler:

Bir blok içinde günlükçü çağrılarını sarmalayarak kapsam kullanın using :

[HttpGet("{id}")]
public async Task<ActionResult<TodoItemDTO>> GetTodoItem(long id)
{
    TodoItem todoItem;

    using (_logger.BeginScope("using block message"))
    {
        _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);
}

Aşağıdaki JSON konsol sağlayıcısı için kapsamları etkinleştirdi:

{
  "Logging": {
    "Debug": {
      "LogLevel": {
        "Default": "Information"
      }
    },
    "Console": {
      "IncludeScopes": true, // Required to use Scopes.
      "LogLevel": {
        "Microsoft": "Warning",
        "Default": "Information"
      }
    },
    "LogLevel": {
      "Default": "Debug"
    }
  }
}

Aşağıdaki kod konsol sağlayıcısı için kapsamları etkinleştirilir:

Genellikle günlüğe kaydetme, kodda değil yapılandırmada belirtilmelidir.

Yerleşik günlük oluşturma sağlayıcıları

ASP.NET Core aşağıdaki günlük sağlayıcılarını içerir:

stdoutASP.NET Core modülüyle günlüğe kaydetme ve hata ayıklama ile ilgili bilgi için bkz Azure App Service IIS ASP.NET Core de ASP.NET Core sorunlarını giderme ASP.NET Core Modülü . ve.

Konsol

ConsoleSağlayıcı çıktıyı konsola kaydeder. Geliştirme sırasında günlükleri görüntüleme hakkında daha fazla bilgi için Console bkz. DotNet Run ve Visual Studio 'Dan çıktıyı günlüğe kaydetme.

Hata ayıklama

DebugSağlayıcı, System. Diagnostics. Debug sınıfını kullanarak günlük çıktısını yazar. System.Diagnostics.Debug.WriteLineSağlayıcıya yazmak için çağrılar Debug .

Linux 'ta, Debug sağlayıcı günlük konumu dağıtıma bağımlıdır ve aşağıdakilerden biri olabilir:

  • /var/log/Message
  • /var/log/Syslog

Olay Kaynağı

EventSourceSağlayıcı, adlı platformlar arası bir olay kaynağına Yazar Microsoft-Extensions-Logging . Windows 'da, sağlayıcı ETWkullanır.

DotNet izleme araçları

DotNet-Trace Aracı, çalışan bir Işlemin .NET Core izlemelerinin toplanmasını sağlayan platformlar arası CLI genel aracıdır. Araç, Microsoft.Extensions.Logging.EventSource kullanarak sağlayıcı verilerini toplar LoggingEventSource .

Bkz. yükleme yönergeleri için DotNet-Trace .

Bir uygulamadan izleme toplamak için DotNet Trace araçları kullanın:

  1. Komutuyla uygulamayı çalıştırın dotnet run .

  2. .NET Core uygulamasının işlem tanımlayıcısını (PID) belirleme:

    Uygulamanın derlemesi ile aynı ada sahip olan işlem için PID 'i bulun.

  3. Komutunu yürütün dotnet trace .

    Genel komut sözdizimi:

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

    PowerShell komut kabuğu kullanırken, --providers değeri tek tırnak işaretleri () içine alın ' :

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

    Windows dışı platformlarda, -f speedscope Çıkış izleme dosyasının biçimini olarak değiştirme seçeneğini ekleyin speedscope .

    Sözcükle Açıklama
    1 İçin meta olayları günlüğe kaydedin LoggingEventSource . Olayları günlüğe kaydetmez ILogger ).
    2 MessageÇağrıldığında olayı açar ILogger.Log() . Programlı (biçimlendirilmedi) bir şekilde bilgi sağlar.
    4 FormatMessageÇağrıldığında olayı açar ILogger.Log() . , Bilgilerin biçimlendirilen dize sürümünü sağlar.
    8 MessageJsonÇağrıldığında olayı açar ILogger.Log() . Bağımsız değişkenlerin JSON gösterimini sağlar.
    Olay düzeyi Description
    0 LogAlways
    1 Critical
    2 Error
    3 Warning
    4 Informational
    5 Verbose

    FilterSpecsiçin girdiler {Logger Category} ve {Event Level} ek günlük filtreleme koşullarını temsil eder. FilterSpecsGirişleri noktalı virgül () ile ayırın ; .

    Bir Windows komut kabuğu (değer etrafında tek tırnakolmadan ) ile örnek --providers :

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

    Yukarıdaki komut şunları etkinleştirir:

    • 4Hatalar () için biçimlendirilen dizeler () üretmek üzere olay kaynağı günlükçüsü 2 .
    • Microsoft.AspNetCore.Hostinggünlüğe kaydetme Informational düzeyinde () günlüğe kaydetme 4 .
  4. ENTER tuşuna veya CTRL + C tuşlarına basarak DotNet izleme araçlarını durdurun.

    İzleme, komutun yürütüldüğü klasörde Trace. NetTrace adıyla kaydedilir dotnet trace .

  5. Trace 'i PerfViewile açın. Trace. NetTrace dosyasını açın ve izleme olaylarını araştırın.

Uygulama Konağı ile derlenmezse CreateDefaultBuilder , olay kaynak sağlayıcısını uygulamanın günlük yapılandırmasına ekleyin.

Daha fazla bilgi için bkz.

PerfView

Günlükleri toplamak ve görüntülemek için PerfView yardımcı programını kullanın. ETW günlüklerini görüntülemeye yönelik başka araçlar da mevcuttur, ancak PerfView, ASP.NET Core tarafından yayınlanan ETW olaylarıyla çalışmak için en iyi deneyimi sağlar.

Bu sağlayıcı tarafından günlüğe kaydedilen olayları toplamak için PerfView 'ı yapılandırmak için, dizeyi *Microsoft-Extensions-Logging ek sağlayıcılar listesine ekleyin. *Dizenin başlangıcında kaçırmayın.

Windows olay günlüğü

EventLogSağlayıcı, Windows olay günlüğüne günlük çıktısı gönderir. Diğer sağlayıcılardan farklı olarak, EventLog sağlayıcı varsayılan sağlayıcı not olmayan ayarları uygulamaz. EventLogGünlük ayarları belirtilmemişse, Varsayılan olarak LogLevel. Warning' ı kullanırlar.

Olayları daha düşük günlüğe kaydetmek için LogLevel.Warning , günlük düzeyini açık olarak ayarlayın. Aşağıdaki örnek, olay günlüğü varsayılan günlük düzeyini şu şekilde ayarlar LogLevel.Information :

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

AddEventLog aşırı yüklemeleri geçiş yapabilir EventLogSettings . nullVeya belirtilmemişse, aşağıdaki varsayılan ayarlar kullanılır:

  • LogName: "Uygulama"
  • SourceName: ".NET çalışma zamanı"
  • MachineName: Yerel makine adı kullanılır.

Aşağıdaki kod, ' SourceName nin varsayılan değerinden öğesini olarak değiştirir ".NET Runtime" 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

Microsoft. Extensions. Logging. AzureAppServices sağlayıcı paketi, günlükleri bir Azure App Service uygulamasının dosya sistemindeki metin dosyalarına ve bir Azure depolama hesabındaki BLOB depolama alanına yazar.

Sağlayıcı paketi, paylaşılan çerçeveye dahil değildir. Sağlayıcıyı kullanmak için sağlayıcı paketini projeye ekleyin.

Sağlayıcı ayarlarını yapılandırmak için AzureFileLoggerOptions AzureBlobLoggerOptions Aşağıdaki örnekte gösterildiği gibi ve kullanın:

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

Uygulama Azure App Service dağıtıldığında, Azure portal App Service sayfasının App Service Günlükler bölümündeki ayarları kullanır. Aşağıdaki ayarlar güncelleştirilirken, değişiklikler uygulamanın yeniden başlatılmasını veya yeniden dağıtımı gerekmeden hemen etkili olur.

  • Uygulama günlüğü (dosya sistemi)
  • Uygulama günlüğü (blob)

Günlük dosyaları için varsayılan konum D: \ Home \ LogFiles \ uygulama klasöründedir ve varsayılan dosya adı diagnostics-yyyymmdd.txt. Varsayılan dosya boyutu sınırı 10 MB 'tır ve tutulan varsayılan en fazla dosya sayısı 2 ' dir. Varsayılan blob adı {app-name} {timestamp}/yyyy/mm/dd/ss/{Guid} -applicationLog.txt.

Bu sağlayıcı yalnızca proje Azure ortamında çalıştırıldığında günlüğe kaydedilir.

Azure günlük akışı

Azure günlük akışı, günlük etkinliklerini gerçek zamanlı olarak görüntülemeyi destekler:

  • Uygulama sunucusu
  • Web sunucusu
  • Başarısız istek izleme

Azure günlük akışını yapılandırmak için:

  • Uygulamanın Portal sayfasından App Service günlükleri sayfasına gidin.
  • Uygulama günlüğünü (FileSystem) Açıkolarak ayarlayın.
  • Günlük düzeyiniseçin. Bu ayar yalnızca Azure günlük akışı için geçerlidir.

Günlükleri görüntülemek için günlük akışı sayfasına gidin. Günlüğe kaydedilen iletiler arabirimiyle günlüğe kaydedilir ILogger .

Azure Application Insights

Microsoft. Extensions. Logging. ApplicationInsights sağlayıcı paketi günlükleri Azure Application Insightsyazar. Application Insights, bir Web uygulamasını izleyen ve telemetri verilerini sorgulamak ve analiz etmek için araçlar sağlayan bir hizmettir. Bu sağlayıcıyı kullanıyorsanız, Application Insights araçlarını kullanarak günlüklerinizi sorgulayabilir ve analiz edebilirsiniz.

Günlüğe kaydetme sağlayıcısı, ASP.NET Core için tüm kullanılabilir telemetri sağlayan paket olan Microsoft. ApplicationInsights. AspNetCore'un bağımlılığı olarak eklenmiştir. Bu paketi kullanırsanız, sağlayıcı paketini yüklemek zorunda kalmazsınız.

Microsoft. ApplicationInsights. Web paketi, ASP.NET Core değil, ASP.NET 4. x içindir.

Daha fazla bilgi için aşağıdaki kaynaklara bakın:

Üçüncü taraf günlük oluşturma sağlayıcıları

ASP.NET Core ile birlikte çalışan üçüncü taraf günlük çerçeveleri:

Bazı üçüncü taraf çerçeveler , yapılandırılmış günlük olarak da bilinen anlam günlüğe kaydetmeişlemini gerçekleştirebilir.

Bir üçüncü taraf çerçevesinin kullanılması, yerleşik sağlayıcılardan birini kullanmaya benzer:

  1. Projenize bir NuGet paketi ekleyin.
  2. ILoggerFactoryGünlüğe kaydetme çerçevesi tarafından sağlanmış bir genişletme yöntemi çağırın.

Daha fazla bilgi için bkz. her sağlayıcının belgeleri. Üçüncü taraf günlüğü sağlayıcıları Microsoft tarafından desteklenmez.

Konak olmayan konsol uygulaması

Genel konağın Web 'de olmayan bir uygulamada nasıl kullanılacağına ilişkin bir örnek için, arka plan görevlerinin örnek uygulaması () program.cs dosyasına bakın ASP.NET Core içinde barındırılan hizmetlerle arka plan görevleri .

Genel ana bilgisayarı olmayan uygulamalar için günlük kodu, sağlayıcıların Eklenme ve günlükçülerin oluşturulmabiçiminde farklılık gösterir.

Günlüğe kaydetme sağlayıcıları

Konak olmayan bir konsol uygulamasında, Add{provider name} oluşturma sırasında sağlayıcının uzantı yöntemini çağırın 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");
    }
}

Günlükleri oluştur

Günlükler oluşturmak için bir nesnesi kullanın ILogger<TCategoryName> . LoggerFactoryOluşturmak için öğesini kullanın ILogger .

Aşağıdaki örnek LoggingConsoleApp.Program , kategorisi olarak bir günlükçü oluşturur.

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");
    }
}

Aşağıdaki ASP.NET CORE örneklerinde, günlükçü, düzeyi olan Günlükler oluşturmak için kullanılır Information . Günlük düzeyi günlüğe kaydedilen etkinliğin önem derecesini gösterir.

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");
    }
}

Düzeyler ve Kategoriler bu belgede daha ayrıntılı olarak açıklanmıştır.

Konak oluşturma sırasında günlüğe kaydet

Ana bilgisayar oluşturma sırasında günlüğe kaydetme doğrudan desteklenmez. Ancak, ayrı bir günlükçü kullanılabilir. Aşağıdaki örnekte, oturum açmak için bir Serilog günlükçüsü kullanılır CreateHostBuilder . AddSerilog, içinde belirtilen statik yapılandırmayı kullanır 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();
        }
    }
}

ILogger 'a bağlı bir hizmet yapılandırma

StartupWeb ana bilgisayarı için ayrı bır dı kapsayıcısı oluşturulduğundan, bir günlükçü 'nin önceki ASP.NET Core sürümlerinde çalışacak şekilde bir günlükçü ekleme. Genel ana bilgisayar için yalnızca bir kapsayıcı oluşturma hakkında daha fazla bilgi için bkz. Son değişiklik duyurusu.

Bağımlı olan bir hizmeti yapılandırmak için ILogger<T> , Oluşturucu ekleme veya bir fabrika yöntemi sağlama kullanın. Fabrika yöntemi yaklaşımı yalnızca başka bir seçenek yoksa önerilir. Örneğin, DI tarafından sağlanmış bir örneğe ihtiyacı olan bir hizmeti düşünün ILogger<T> :

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

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

Önceki vurgulanmış kod, ilk kez Func , bir örneği oluşturmak IÇIN, dı kapsayıcısının bir örneğini oluşturmak için gereken bir Func MyService . Kayıtlı hizmetlerden herhangi birine bu şekilde erişebilirsiniz.

Ana oturum oluşturma

Aşağıdaki kod, Main ILogger konak oluşturulduktan sonra bir örneğinden bir örnek alarak oturum açar:

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

Başlangıçta günlük oluşturma

Aşağıdaki kod günlükleri içinde yazar 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();
    });
}

Yöntemde dı kapsayıcı kurulumu tamamlanmadan önce Günlüklerin yazılması Startup.ConfigureServices desteklenmez:

  • Oluşturucuya günlükçü ekleme Startup desteklenmiyor.
  • Yöntem imzasına günlükçü ekleme Startup.ConfigureServices desteklenmiyor

Bu kısıtlamanın nedeni, günlük kaydının dı ve yapılandırmaya göre değişir ve bu da, ara ' ya bağlıdır. Dı kapsayıcısı bitene kadar ayarlanamaz ConfigureServices .

ILogger<T>Bir günlükçü 'nin daha önceki sürümlerde çalışma alanına bağlı olan veya neden Oluşturucu ekleme hakkında bilgi için Startup , bkz. ILogger 'a bağımlı olan bir hizmeti yapılandırma

Zaman uyumsuz günlükçü yöntemi yok

Günlüğe kaydetme, zaman uyumsuz kodun performans maliyetine değer olmaması kadar hızlı olmalıdır. Günlüğe kaydetme veri deposu yavaşsa doğrudan yazma. Günlük iletilerini başlangıçta hızlı bir mağazaya yazmayı ve sonra bunları yavaş depoya daha sonra taşımayı düşünün. Örneğin, SQL Server oturum açarken Log Yöntemler zaman uyumlu olduğundan doğrudan bir yöntemde yapmayın Log . Bunun yerine, günlük iletilerini bir bellek içi kuyruğa eşzamanlı olarak ekleyin ve bir arka plan çalışanı, SQL Server veri gönderme zaman uyumsuz çalışmasını sağlamak için iletileri kuyruktan çekin. Daha fazla bilgi için Bu GitHub sorununa bakın.

Çalışan bir uygulamadaki günlük düzeylerini değiştirme

Günlüğe kaydetme API 'SI, bir uygulama çalışırken günlük düzeylerini değiştirme senaryosu içermez. Ancak, bazı yapılandırma sağlayıcıları yapılandırmayı yeniden yükleme yeteneğine sahiptir ve bu, günlüğe kaydetme yapılandırması üzerinde etkili bir şekilde gerçekleşir. Örneğin, dosya yapılandırma sağlayıcısı, günlük yapılandırmasını varsayılan olarak yeniden yükler. Uygulama çalışırken kodda yapılandırma değiştirilirse uygulama, uygulamanın günlük yapılandırmasını güncelleştirmek için IController. Reload ' i çağırabilir.

ILogger ve ıloggerfactory

ILogger<TCategoryName>Ve ILoggerFactory arabirimleri ve uygulamaları .NET Core SDK dahil edilmiştir. Bunlar ayrıca aşağıdaki NuGet paketlerinde de kullanılabilir:

Koddaki günlük filtresi kurallarını Uygula

Günlük filtresi kurallarını ayarlamak için tercih edilen yaklaşım yapılandırmakullanmaktır.

Aşağıdaki örnek, koddaki filtre kurallarının nasıl kaydedileceği gösterilmektedir:

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)``SystemKategori ve günlük düzeyini belirtir Debug . Belirli bir sağlayıcı yapılandırılmadığı için filtre tüm sağlayıcılara uygulanır.

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

  • DebugGünlüğe kaydetme sağlayıcısı.
  • Günlük düzeyi Information ve üzeri.
  • İle başlayan tüm kategoriler "Microsoft" .

Özel günlükçü oluşturma

Özel bir günlükçü eklemek için bir ile ekleyin ILoggerProvider ILoggerFactory :

public void Configure(
    IApplicationBuilder app,
    IWebHostEnvironment env,
    ILoggerFactory loggerFactory)
{
    loggerFactory.AddProvider(new CustomLoggerProvider(new CustomLoggerConfiguration()));

, ILoggerProvider Bir veya daha fazla ILogger örnek oluşturur. ILoggerÖrnekler, bilgileri günlüğe kaydetmek için Framework tarafından kullanılır.

Örnek özel günlükçü yapılandırması

Örnek:

  • , Olay KIMLIĞI ve günlük düzeyi tarafından günlük konsolunun rengini ayarlayan çok basit bir örnek olacak şekilde tasarlanmıştır. Günlükçüler genellikle olay KIMLIĞINE göre değişmez ve günlük düzeyine özgü değildir.
  • Aşağıdaki yapılandırma türünü kullanarak günlük düzeyi ve olay KIMLIĞI başına farklı renk konsolu girdileri oluşturur:
public class ColorConsoleLoggerConfiguration
{
    public LogLevel LogLevel { get; set; } = LogLevel.Warning;
    public int EventId { get; set; } = 0;
    public ConsoleColor Color { get; set; } = ConsoleColor.Yellow;
}

Yukarıdaki kod, varsayılan düzeyi olarak Warning ' i ve rengini olarak ayarlar Yellow . EventId0 olarak ayarlanırsa tüm olayları günlüğe göndereceğiz.

Özel günlükçü oluşturma

ILoggerUygulama kategorisi adı genellikle günlük kaynağıdır. Örneğin, günlükçü 'nin oluşturulduğu tür:

public class ColorConsoleLogger : ILogger
{
    private readonly string _name;
    private readonly ColorConsoleLoggerConfiguration _config;

    public ColorConsoleLogger(string name, ColorConsoleLoggerConfiguration config)
    {
        _name = name;
        _config = config;
    }

    public IDisposable BeginScope<TState>(TState state)
    {
        return null;
    }

    public bool IsEnabled(LogLevel logLevel)
    {
        return logLevel == _config.LogLevel;
    }

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, 
                        Exception exception, Func<TState, Exception, string> formatter)
    {
        if (!IsEnabled(logLevel))
        {
            return;
        }

        if (_config.EventId == 0 || _config.EventId == eventId.Id)
        {
            var color = Console.ForegroundColor;
            Console.ForegroundColor = _config.Color;
            Console.WriteLine($"{logLevel} - {eventId.Id} " +
                              $"- {_name} - {formatter(state, exception)}");
            Console.ForegroundColor = color;
        }
    }
}

Yukarıdaki kod:

  • Kategori adı başına bir günlükçü örneği oluşturur.
  • İade logLevel == _config.LogLevel eder IsEnabled , her birinin logLevel benzersiz bir günlükçü vardır. Günlükçüler genellikle daha yüksek günlük seviyeleri için de etkinleştirilmelidir:
public bool IsEnabled(LogLevel logLevel)
{
    return logLevel >= _config.LogLevel;
}

Özel LoggerProvider oluşturma

, LoggerProvider Günlükçü örneklerini oluşturan sınıftır. Kategori başına bir günlükçü örneği oluşturmak gerekli değildir, ancak bu, NLog veya Log4net gibi bazı Günlükçüler için mantıklı olur. Bunu yaptığınızda, gerekirse kategori başına farklı günlüğe kaydetme çıkış hedeflerini de seçebilirsiniz:

public class ColorConsoleLoggerProvider : ILoggerProvider
{
    private readonly ColorConsoleLoggerConfiguration _config;
    private readonly ConcurrentDictionary<string, ColorConsoleLogger> _loggers = new ConcurrentDictionary<string, ColorConsoleLogger>();

    public ColorConsoleLoggerProvider(ColorConsoleLoggerConfiguration config)
    {
        _config = config;
    }

    public ILogger CreateLogger(string categoryName)
    {
        return _loggers.GetOrAdd(categoryName, name => new ColorConsoleLogger(name, _config));
    }

    public void Dispose()
    {
        _loggers.Clear();
    }
}

Yukarıdaki kodda, CreateLogger Kategori başına adının tek bir örneğini oluşturur ColorConsoleLogger ve içinde depolar ConcurrentDictionary<TKey,TValue> .

Özel günlükçü kullanımı ve kaydı

Günlükçü kayıt defteri Startup.Configure :

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, 
                      ILoggerFactory loggerFactory)
{
    // Default registration.
    loggerFactory.AddProvider(new ColorConsoleLoggerProvider(
                              new ColorConsoleLoggerConfiguration
    {
        LogLevel = LogLevel.Error,
        Color = ConsoleColor.Red
    }));

    // Custom registration with default values.
    loggerFactory.AddColorConsoleLogger();

    // Custom registration with a new configuration instance.
    loggerFactory.AddColorConsoleLogger(new ColorConsoleLoggerConfiguration
    {
        LogLevel = LogLevel.Debug,
        Color = ConsoleColor.Gray
    });

    // Custom registration with a configuration object.
    loggerFactory.AddColorConsoleLogger(c =>
    {
        c.LogLevel = LogLevel.Information;
        c.Color = ConsoleColor.Blue;
    });

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }
    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

Yukarıdaki kod için, için en az bir genişletme yöntemi sağlayın ILoggerFactory :

public static class ColorConsoleLoggerExtensions
{
    public static ILoggerFactory AddColorConsoleLogger(
                                      this ILoggerFactory loggerFactory, 
                                      ColorConsoleLoggerConfiguration config)
    {
        loggerFactory.AddProvider(new ColorConsoleLoggerProvider(config));
        return loggerFactory;
    }
    public static ILoggerFactory AddColorConsoleLogger(
                                      this ILoggerFactory loggerFactory)
    {
        var config = new ColorConsoleLoggerConfiguration();
        return loggerFactory.AddColorConsoleLogger(config);
    }
    public static ILoggerFactory AddColorConsoleLogger(
                                    this ILoggerFactory loggerFactory, 
                                    Action<ColorConsoleLoggerConfiguration> configure)
    {
        var config = new ColorConsoleLoggerConfiguration();
        configure(config);
        return loggerFactory.AddColorConsoleLogger(config);
    }
}

Ek kaynaklar

Tom Dykstra ve Steve Smith tarafından

.NET Core, çeşitli yerleşik ve üçüncü taraf oturum açma sağlayıcılarıyla birlikte çalışarak bir günlüğe kaydetme API 'sini destekler. Bu makalede, yerleşik sağlayıcılarla günlüğe kaydetme API 'sinin nasıl kullanılacağı gösterilmektedir.

Örnek kodu görüntüleme veya indirme (nasıl indirileceği)

Sağlayıcı Ekle

Günlük sağlayıcısı günlükleri görüntüler veya depolar. Örneğin, konsol sağlayıcısı günlükleri konsolunda görüntüler ve Azure Application Insights sağlayıcısı bunları Azure Application Insights depolar. Birden çok sağlayıcı eklenerek Günlükler birden çok hedefe gönderilebilir.

Bir sağlayıcı eklemek için sağlayıcının Add{provider name} uzantı yöntemini program.csiçinde çağırın:

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

    webHost.Run();
}

Yukarıdaki kod, ve için başvuruları Microsoft.Extensions.Logging gerektirir Microsoft.Extensions.Configuration .

Varsayılan proje şablonu, CreateDefaultBuilder aşağıdaki günlük sağlayıcılarını ekleyen çağırır:

  • Konsol
  • Hata ayıklama
  • EventSource (ASP.NET Core 2,2 ' den başlayarak)
public static void Main(string[] args)
{
    CreateWebHostBuilder(args).Build().Run();
}

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

Kullanıyorsanız CreateDefaultBuilder , varsayılan sağlayıcıları kendi seçimlerinizle değiştirebilirsiniz. ClearProvidersÖğesini çağırın ve istediğiniz sağlayıcıları ekleyin.

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

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

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

    host.Run();
}

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

Makalenin ilerleyen kısımlarında yerleşik günlük sağlayıcıları ve üçüncü taraf günlüğü sağlayıcıları hakkında daha fazla bilgi edinin.

Günlükleri oluştur

Günlükler oluşturmak için bir nesnesi kullanın ILogger<TCategoryName> . Bir Web uygulamasında veya barındırılan hizmette, bir ILogger bağımlılık ekleme (dı) kaynağından yararlanın. Konak dışı konsol uygulamalarında, oluşturmak için öğesini kullanın LoggerFactory ILogger .

Aşağıdaki ASP.NET Core örnek, kategorisi olarak içeren bir günlükçü oluşturur TodoApiSample.Pages.AboutModel . Günlük kategorisi , her günlük ile ilişkili bir dizedir. ILogger<T>Dı tarafından belirtilen örnek, kategori olarak tam nitelikli adı olan Günlükler oluşturur T .

public class AboutModel : PageModel
{
    private readonly ILogger _logger;

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

Aşağıdaki ASP.NET Core ve konsol uygulaması örneklerinde, günlükçü, düzeyi olan Günlükler oluşturmak için kullanılır Information . Günlük düzeyi günlüğe kaydedilen etkinliğin önem derecesini gösterir.

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

Düzeyler ve Kategoriler Bu makalenin ilerleyen kısımlarında daha ayrıntılı olarak açıklanmıştır.

Başlangıçta günlük oluşturma

Sınıf içindeki günlükleri yazmak için Startup , ILogger Oluşturucu imzasına bir parametre ekleyin:

public class Startup
{
    private readonly ILogger _logger;

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

    public IConfiguration Configuration { get; }

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

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

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

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

        app.UseMvc();
    }
}

Program sınıfında Günlükler oluşturma

Sınıf içindeki günlükleri yazmak için Program , ILogger dı 'den bir örnek alın:

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

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

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

    host.Run();
}

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

Ana bilgisayar oluşturma sırasında günlüğe kaydetme doğrudan desteklenmez. Ancak, ayrı bir günlükçü kullanılabilir. Aşağıdaki örnekte, oturum açmak için bir Serilog günlükçüsü kullanılır CreateWebHostBuilder . AddSerilog, içinde belirtilen statik yapılandırmayı kullanır Log.Logger :

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

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

    public static IWebHostBuilder CreateWebHostBuilder(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 WebHost.CreateDefaultBuilder(args)
                .ConfigureServices((context, services) =>
                {
                    services.AddMvc();
                })
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    config.AddConfiguration(builtConfig);
                })
                .ConfigureLogging(logging =>
                {
                    logging.AddSerilog();
                })
                .UseStartup<Startup>();
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Host builder error");

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

Zaman uyumsuz günlükçü yöntemi yok

Günlüğe kaydetme, zaman uyumsuz kodun performans maliyetine değer olmaması kadar hızlı olmalıdır. Günlüğe kaydetme veri depoluizin yavaşsa, doğrudan buna yazmayın. Başlangıç olarak günlük iletilerini hızlı bir mağazaya yazmayı ve sonra yavaş depoya daha sonra taşımayı düşünün. Örneğin, SQL Server için oturum açıyorsanız Log Yöntemler zaman uyumlu olduğundan, bunu doğrudan bir yöntemde yapmak istemezsiniz Log . Bunun yerine, günlük iletilerini bir bellek içi kuyruğa eşzamanlı olarak ekleyin ve bir arka plan çalışanı, SQL Server veri gönderme zaman uyumsuz çalışmasını sağlamak için iletileri kuyruktan çekin. Daha fazla bilgi için Bu GitHub sorununa bakın.

Yapılandırma

Günlüğe kaydetme sağlayıcısı yapılandırması bir veya daha fazla yapılandırma sağlayıcısı tarafından sağlanır:

  • Dosya biçimleri (ıNı, JSON ve XML).
  • Komut satırı bağımsız değişkenleri.
  • Ortam değişkenleri.
  • Bellek içi .NET nesneleri.
  • Şifrelenmemiş gizli dizi Yöneticisi depolaması.
  • Azure Key Vaultgibi şifreli bir kullanıcı deposu.
  • Özel sağlayıcılar (yüklü veya oluşturulmuş).

Örneğin, günlük yapılandırma genellikle Logging uygulama ayarları dosyalarının bölümü tarafından sağlanır. Aşağıdaki örnek, dosyasındaki tipik bir appsettings.Development.js içeriğini gösterir:

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

LoggingÖzelliği, LogLevel ve günlük sağlayıcısı özelliklerine sahip olabilir (konsol gösterilir).

LogLevelAltındaki özelliği, Logging Seçili kategoriler için günlüğe kaydedilecek minimum düzeyi belirtir. Örnekte System ve Microsoft Kategoriler düzeyinde günlüğe kaydedilir Information ve diğer tüm diğerleri düzeyinde günlüğe kaydedilir Debug .

LoggingGünlük sağlayıcılarını belirt altındaki diğer özellikler. Örnek, konsol sağlayıcısına yöneliktir. Bir sağlayıcı, günlük kapsamlarınıdestekliyorsa, etkinleştirilip etkinleştirilmeyeceğini IncludeScopes belirtir. Bir sağlayıcı özelliği (örnekte olduğu gibi Console ), bir özellik de belirtebilir LogLevel . LogLevelsağlayıcı altında, bu sağlayıcının günlüğe kaydedilecek düzeyleri belirtir.

' De düzeyler belirtilirse Logging.{providername}.LogLevel , içinde ayarlanan her şeyi geçersiz kılar Logging.LogLevel . Örneğin, aşağıdaki JSON 'u göz önünde bulundurun:

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

Önceki JSON 'da, Console sağlayıcı ayarları önceki (varsayılan) günlük düzeyini geçersiz kılar.

Günlüğe kaydetme API 'SI, bir uygulama çalışırken günlük düzeylerini değiştirme senaryosu içermez. Ancak, bazı yapılandırma sağlayıcıları yapılandırmayı yeniden yükleme yeteneğine sahiptir ve bu, günlüğe kaydetme yapılandırması üzerinde etkili bir şekilde gerçekleşir. Örneğin, ayar dosyalarını okumak için tarafından eklenen dosya yapılandırma sağlayıcısı CreateDefaultBuilder , günlük yapılandırmasını varsayılan olarak yeniden yükler. Uygulama çalışırken kodda yapılandırma değiştirilirse uygulama, uygulamanın günlük yapılandırmasını güncelleştirmek için IController. Reload ' i çağırabilir.

Yapılandırma sağlayıcılarını uygulama hakkında daha fazla bilgi için bkz ASP.NET Core'de yapılandırma ..

Örnek günlüğe kaydetme çıkışı

Yukarıdaki bölümde gösterilen örnek kodla, uygulama komut satırından çalıştırıldığında Günlükler konsolunda görüntülenir. Konsol çıkışının bir örneği aşağıda verilmiştir:

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:5000/api/todo/0
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Executing action method TodoApi.Controllers.TodoController.GetById (TodoApi) with arguments (0) - ModelState is Valid
info: TodoApi.Controllers.TodoController[1002]
      Getting item 0
warn: TodoApi.Controllers.TodoController[4000]
      GetById(0) NOT FOUND
info: Microsoft.AspNetCore.Mvc.StatusCodeResult[1]
      Executing HttpStatusCodeResult, setting HTTP status code 404
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action TodoApi.Controllers.TodoController.GetById (TodoApi) in 42.9286ms
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 148.889ms 404

Yukarıdaki Günlükler, üzerinde örnek uygulamaya bir HTTP GET isteği yapılarak oluşturulmuştur http://localhost:5000/api/todo/0 .

Visual Studio 'da örnek uygulamayı çalıştırdığınızda hata ayıklama penceresinde göründükleri günlüklere yönelik bir örnek aşağıda verilmiştir:

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

ILoggerYukarıdaki bölümde gösterilen çağrılar tarafından oluşturulan Günlükler "TodoApi" ile başlar. "Microsoft" kategorileri ile başlayan Günlükler ASP.NET Core Framework kodundan alınır. ASP.NET Core ve uygulama kodu aynı günlük API 'sini ve sağlayıcılarını kullanıyor.

Bu makalenin geri kalanında günlüğe kaydetme için bazı ayrıntılar ve seçenekler açıklanmaktadır.

NuGet paketleri

ILoggerVe ILoggerFactory arabirimleri Microsoft. Extensions. Logging. soyutlamalariçinde ve bu uygulamalar için varsayılan uygulamalar Microsoft. Extensions. Loggingiçinde bulunur.

Günlük kategorisi

Bir ILogger nesne oluşturulduğunda, için bir Kategori belirtilir. Bu kategori, bu örneği tarafından oluşturulan her günlük iletisine dahildir ILogger . Kategori herhangi bir dize olabilir, ancak kural, "TodoApi. Controllers. TodoController" gibi sınıf adını kullanmaktır.

ILogger<T> ILogger Kategori olarak tam nitelikli tür adını kullanan bir örnek almak için kullanın T :

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

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

Kategoriyi açıkça belirtmek için şunu çağırın ILoggerFactory.CreateLogger :

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

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

ILogger<T>, CreateLogger tam nitelikli tür adı ile çağırma ile eşdeğerdir T .

Günlük düzeyi

Her günlük bir LogLevel değer belirtir. Günlük düzeyi önem derecesini veya önemini gösterir. Örneğin, bir yöntem Information normal olarak sona erdiğinde ve bir Warning Yöntem 404 bulunmayan bir durum kodu döndürdüğünde bir günlük yazabilirsiniz.

Aşağıdaki kod oluşturur Information ve Warning günlükleri:

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

Yukarıdaki kodda, MyLogEvents.GetItem ve MyLogEvents.GetItemNotFound parametreleri günlük olay kimliğidir. İkinci parametre, kalan Yöntem parametreleri tarafından belirtilen bağımsız değişken değerleri için yer tutucuları olan bir ileti şablonudur. Yöntem parametreleri bu makaledeki günlük iletisi şablonu bölümünde açıklanmaktadır.

Yöntem adında düzeyi (örneğin, ve) içeren günlük yöntemleri, LogInformation LogWarning ILogger için uzantı yöntemleridir. Bu yöntemler bir Log parametre alan bir yöntemi çağırır LogLevel . LogYöntemi bu uzantı yöntemlerinden biri yerine doğrudan çağırabilirsiniz, ancak söz dizimi görece karmaşıktır. Daha fazla bilgi için bkz ILogger . ve günlükçü uzantıları kaynak kodu.

ASP.NET Core, en küçükten en yüksek öneme doğru sıralanan aşağıdaki günlük düzeylerini tanımlar.

  • İzleme = 0

    Genellikle yalnızca hata ayıklama için değerli bilgiler için. Bu iletiler hassas uygulama verileri içerebilir, bu nedenle bir üretim ortamında etkinleştirilmemelidir. Varsayılan olarak devre dışıdır.

  • Hata Ayıkla = 1

    Geliştirme ve hata ayıklama konusunda yararlı olabilecek bilgiler için. Örnek: Entering method Configure with flag set to true. Debug yüksek günlük hacimden dolayı yalnızca sorun giderirken üretim ortamında düzey günlüklerini etkinleştirin.

  • Bilgi = 2

    Uygulamanın genel akışını izlemek için. Bu günlüklerde genellikle uzun süreli bir değer vardır. Örnek: Request received for path /api/todo

  • Uyarı = 3

    Uygulama akışında anormal veya beklenmedik olaylar için. Bunlar, uygulamanın durmasına neden olmayan ancak araştırılması gerekebilecek hataları veya diğer koşulları içerebilir. İşlenmiş özel durumlar, günlük düzeyini kullanmak için yaygın bir yerdir Warning . Örnek: FileNotFoundException for file quotes.txt.

  • Hata = 4

    İşlenemeyen hatalar ve özel durumlar için. Bu iletiler, uygulama genelinde bir hata değil geçerli etkinlikte veya işlemde (geçerli HTTP isteği gibi) bir hata olduğunu gösterir. Örnek günlük iletisi:Cannot insert record due to duplicate key violation.

  • Kritik = 5

    Anında ilgilenilmesi gereken hatalarda. Örnekler: veri kaybı senaryoları, disk alanı yetersiz.

Belirli bir depolama ortamında veya görüntüleme penceresinde ne kadar günlük çıkışının yazıldığını denetlemek için günlük düzeyini kullanın. Örneğin:

  • Üretimde:
    • Geçiş düzeyinde günlüğe kaydetme, Trace Information yüksek hacimli ayrıntılı günlük iletileri oluşturur. Maliyetleri denetlemek ve veri depolama sınırlarını aşmamak için, Trace Information düzey iletiler üzerinden yüksek hacimli, düşük maliyetli bir veri deposuna oturum açın.
    • Düzeylerde oturum açma işlemi Warning Critical genellikle daha az, daha küçük günlük iletileri üretir. Bu nedenle, maliyetler ve depolama sınırları genellikle bir sorun değildir ve bu da veri deposu seçiminden daha fazla esneklik elde etmez.
  • Geliştirme sırasında:
    • WarningKonsola iletiler aracılığıyla oturum açın Critical .
    • Trace Information Sorun giderirken iletiler aracılığıyla ekleyin.

Bu makalede daha sonra bulunan günlük filtreleme bölümünde, bir sağlayıcının hangi günlük düzeylerinin işlediğini nasıl denetleneceği açıklanmaktadır.

ASP.NET Core çerçeve olayları için günlükleri yazar. Bu makalenin önceki kısımlarında yer alınan günlük örnekleri, günlüklerin altında tutulur Information , bu nedenle hiçbir Debug veya Trace düzeyi günlük oluşturulmaz. Günlükleri göstermek için yapılandırılmış örnek uygulama çalıştırılarak oluşturulan konsol günlüklerinin bir örneği aşağıda verilmiştir Debug :

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:62555/api/todo/0
dbug: Microsoft.AspNetCore.Routing.Tree.TreeRouter[1]
      Request successfully matched the route with name 'GetTodo' and template 'api/Todo/{id}'.
dbug: Microsoft.AspNetCore.Mvc.Internal.ActionSelector[2]
      Action 'TodoApi.Controllers.TodoController.Update (TodoApi)' with id '089d59b6-92ec-472d-b552-cc613dfd625d' did not match the constraint 'Microsoft.AspNetCore.Mvc.Internal.HttpMethodActionConstraint'
dbug: Microsoft.AspNetCore.Mvc.Internal.ActionSelector[2]
      Action 'TodoApi.Controllers.TodoController.Delete (TodoApi)' with id 'f3476abe-4bd9-4ad3-9261-3ead09607366' did not match the constraint 'Microsoft.AspNetCore.Mvc.Internal.HttpMethodActionConstraint'
dbug: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Executing action TodoApi.Controllers.TodoController.GetById (TodoApi)
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Executing action method TodoApi.Controllers.TodoController.GetById (TodoApi) with arguments (0) - ModelState is Valid
info: TodoApi.Controllers.TodoController[1002]
      Getting item 0
warn: TodoApi.Controllers.TodoController[4000]
      GetById(0) NOT FOUND
dbug: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action method TodoApi.Controllers.TodoController.GetById (TodoApi), returned result Microsoft.AspNetCore.Mvc.NotFoundResult.
info: Microsoft.AspNetCore.Mvc.StatusCodeResult[1]
      Executing HttpStatusCodeResult, setting HTTP status code 404
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action TodoApi.Controllers.TodoController.GetById (TodoApi) in 0.8788ms
dbug: Microsoft.AspNetCore.Server.Kestrel[9]
      Connection id "0HL6L7NEFF2QD" completed keep alive response.
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 2.7286ms 404

Günlüğe olay KIMLIĞI

Her günlük bir olay kimliğibelirtebilir. Örnek uygulama bunu yerel olarak tanımlanmış bir sınıf kullanarak yapar LoggingEvents :

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

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

Olay KIMLIĞI bir olay kümesini ilişkilendirir. Örneğin, bir sayfadaki öğelerin listesini görüntülemek için ilgili tüm Günlükler 1001 olabilir.

Günlüğe kaydetme sağlayıcısı, olay KIMLIĞINI günlüğe kaydetme iletisindeki kimlik alanında veya hiç değil, bir kimlik alanında saklayabilir. Hata ayıklama sağlayıcısı olay kimliklerini göstermiyor. Konsol sağlayıcısı, etkinlik kimliklerini kategoriden sonra parantez içinde gösterir:

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

Günlük iletisi şablonu

Her günlük bir ileti şablonunu belirtir. İleti şablonu, bağımsız değişkenlerin sağlandığı yer tutucuları içerebilir. Sayılar değil, yer tutucular için adları kullanın.

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

Adlarının, değerlerinin sağlanması için hangi parametrelerin kullanılacağını belirleyen yer tutucular sırası. Aşağıdaki kodda, parametre adlarının ileti şablonunda sıra dışı olduğuna dikkat edin:

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

Bu kod, sırasıyla parametre değerleriyle bir günlük iletisi oluşturur:

Parameter values: parm1, parm2

Günlüğe kaydetme altyapısı bu şekilde çalışarak, günlük sağlayıcılarının yapılandırılmış günlüğe yazma olarak da bilinen anlamsal günlüğüuygulayabilmesini sağlayabilir. Bağımsız değişkenler yalnızca biçimli ileti şablonuna değil, günlük sistemine geçirilir. Bu bilgiler, günlük sağlayıcılarının parametre değerlerini alan olarak depolamasına olanak sağlar. Örneğin, günlükçü yönteminin şuna benzer şekilde göründüğünü varsayın:

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

Günlükleri Azure Tablo depolama alanına gönderiyorsanız, her bir Azure Tablo varlığı, ID RequestTime günlük verilerinde sorguları basitleştiren ve özelliklere sahip olabilir. Bir sorgu, belirli bir aralıktaki tüm günlükleri, RequestTime Kısa mesajdan zaman aşımını ayrıştırmadan bulabilir.

Günlüğe kaydetme özel durumları

Günlükçü yöntemlerinin, aşağıdaki örnekte olduğu gibi bir özel durum iletmenizi sağlayan aşırı yüklemeleri vardır:

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

Özel durum bilgileri farklı yollarla farklı sağlayıcılarda işler. Yukarıda gösterilen koddan hata ayıklama sağlayıcısı çıktısına bir örnek aşağıda verilmiştir.

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

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

Günlük filtreleme

Belirli bir sağlayıcı ve kategori için en az bir günlük düzeyi veya tüm sağlayıcılar ya da tüm kategoriler için belirtebilirsiniz. Minimum düzeyin altındaki tüm Günlükler bu sağlayıcıya aktarılmaz, bu nedenle görüntülenmez veya depolanmaz.

Tüm günlükleri gizlemek için LogLevel.None En düşük günlük düzeyi olarak belirtin. Öğesinin tamsayı değeri LogLevel.None 6 ' dır LogLevel.Critical (5) daha yüksektir.

Yapılandırmada filtre kuralları oluşturma

Proje şablonu kodu, CreateDefaultBuilder konsol, hata ayıklama ve EventSource (ASP.NET Core 2,2 veya üzeri) sağlayıcılar için günlük kaydı ayarlamak için çağırır. CreateDefaultBuilderYöntemi Logging , Bu makalenin önceki kısımlarındaaçıklandığı gibi, bir bölümde yapılandırmayı aramak için günlük kaydı yapar.

Yapılandırma verileri aşağıdaki örnekte olduğu gibi sağlayıcıya ve kategoriye göre en düşük günlük düzeylerini belirtir:

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

Bu JSON altı filtre kuralı oluşturur: biri hata ayıklama sağlayıcısı, konsol sağlayıcısı için dört ve diğeri tüm sağlayıcılar için. Bir nesne oluşturulduğunda her sağlayıcı için tek bir kural seçilir ILogger .

Koddaki filtre kuralları

Aşağıdaki örnek, koddaki filtre kurallarının nasıl kaydedileceği gösterilmektedir:

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

İkincisi, AddFilter hata ayıklama sağlayıcısını tür adını kullanarak belirtir. Birincisi AddFilter bir sağlayıcı türü belirtmediğinden, tüm sağlayıcılar için geçerlidir.

Filtreleme kuralları nasıl uygulanır

Yapılandırma verileri ve AddFilter Önceki örneklerde gösterilen kod, aşağıdaki tabloda gösterilen kuralları oluşturur. İlk altı yapılandırma örneğinde ve son iki ise kod örneğinde gelir.

Sayı Sağlayıcı Şununla başlayan Kategoriler... En düşük günlük düzeyi
1 Hata ayıklama Tüm kategoriler Bilgi
2 Konsol Microsoft. AspNetCore. Mvc. Razor . İç Uyarı
3 Konsol Microsoft. AspNetCore. Mvc. Razor .Razor Hata ayıklama
4 Konsol Microsoft. AspNetCore. Mvc.Razor Hata
5 Konsol Tüm kategoriler Bilgi
6 Tüm sağlayıcılar Tüm kategoriler Hata ayıklama
7 Tüm sağlayıcılar Sistem Hata ayıklama
8 Hata ayıklama Microsoft İzleme

Bir ILogger nesne oluşturulduğunda, ILoggerFactory nesne bu günlükçü için uygulanacak her sağlayıcı için tek bir kural seçer. Bir örnek tarafından yazılan tüm iletiler ILogger , seçilen kurallara göre filtrelenmiştir. Her sağlayıcı ve kategori çifti için mümkün olan en özel kural kullanılabilir kurallardan seçilir.

Belirli bir kategori için oluşturulan her sağlayıcı için aşağıdaki algoritma kullanılır ILogger :

  • Sağlayıcı veya diğer adıyla eşleşen tüm kuralları seçin. Hiçbir eşleşme bulunmazsa, boş bir sağlayıcıya sahip tüm kurallar ' ı seçin.
  • Önceki adımın sonucunda, en uzun eşleşen kategori ön ekine sahip kurallar ' ı seçin. Eşleşme bulunmazsa, kategori belirtmeyen tüm kuralları seçin.
  • Birden çok kural seçilirse, son olanı götürün.
  • Hiçbir kural seçilmezse, kullanın MinimumLevel .

Yukarıdaki kurallarla ilgili olarak, ILogger "Microsoft. AspNetCore. Mvc." adlı kategori için bir nesne oluşturduğunuzu varsayalım. Razor Razor ViewEngine ":

  • Hata ayıklama sağlayıcısı, kurallar 1, 6 ve 8 için geçerlidir. Kural 8 ' i en özeldir, yani seçili olanı seçilidir.
  • Konsol sağlayıcısı için, kurallar 3, 4, 5 ve 6 geçerlidir. Kural 3 en özeldir.

Elde edilen ILogger örnek, Trace hata ayıklama sağlayıcısına düzeyi ve üzeri Günlükler gönderir. DebugDüzeyi ve üzeri Günlükler konsol sağlayıcısına gönderilir.

Sağlayıcı diğer adları

Her sağlayıcı, tam nitelikli tür adı yerine yapılandırmada kullanılabilecek bir diğer ad tanımlar. Yerleşik sağlayıcılar için aşağıdaki diğer adları kullanın:

  • Konsol
  • Hata ayıklama
  • EventSource
  • EventLog
  • TraceSource
  • AzureAppServicesFile
  • AzureAppServicesBlob
  • ApplicationInsights

Varsayılan en düşük düzey

Yalnızca belirli bir sağlayıcı ve kategori için yapılandırma veya koddan kural uygulanmaz geçerli olan en düşük düzey ayar vardır. Aşağıdaki örnekte, en düşük düzeyin nasıl ayarlanacağı gösterilmektedir:

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

En düşük düzeyi açıkça ayarlamazsanız, varsayılan değer olur Information ve bu, Trace Debug günlüklerin yok sayılacağı anlamına gelir.

Filtre işlevleri

Configuration veya Code tarafından kendisine atanmış kuralları olmayan tüm sağlayıcılar ve kategoriler için bir filtre işlevi çağırılır. İşlevindeki kodun sağlayıcı türü, kategorisi ve günlük düzeyine erişimi vardır. Örneğin:

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

Sistem kategorileri ve Düzeyler

ASP.NET Core ve Entity Framework Core tarafından kullanılan bazı kategoriler şunlardır ve bunlardan beklenen Günlükler hakkında notlar bulunur:

Kategori Notlar
Microsoft.AspNetCore Genel ASP.NET Core tanılama.
Microsoft.AspNetCore.DataProtection Hangi anahtarların kabul edildiği, bulunduğu ve kullanıldığı.
Microsoft.AspNetCore.HostFiltering İzin verilen konaklar.
Microsoft.AspNetCore.Hosting HTTP isteklerinin tamamlanması için geçen süre ve ne zaman başladıkları. Hangi barındırma başlangıç derlemeleri yüklendi.
Microsoft.AspNetCore.Mvc MVC ve Razor Tanılama. Model bağlama, filtre yürütme, derlemeyi görüntüleme, eylem seçimi.
Microsoft.AspNetCore.Routing Eşleşen bilgileri yönlendirin.
Microsoft. AspNetCore. Server Bağlantı başlatın, durdurun ve canlı yanıtları koruyun. HTTPS sertifika bilgileri.
Microsoft.AspNetCore.StaticFiles Sunulan dosyalar.
Microsoft. EntityFrameworkCore Genel Entity Framework Core tanılama. Veritabanı etkinliği ve yapılandırması, değişiklik algılama, geçişler.

Günlük kapsamları

Kapsam bir mantıksal işlemler kümesini gruplandırabilir. Bu gruplandırma, kümenin bir parçası olarak oluşturulan her günlüğe aynı verileri eklemek için kullanılabilir. Örneğin, bir işlemin işlenmesi kapsamında oluşturulan her günlük işlem KIMLIĞI içerebilir.

Kapsam IDisposable , yöntemi tarafından döndürülen BeginScope ve atılana kadar sürer olan bir türdür. Bir blok içinde günlükçü çağrılarını sarmalayarak kapsam kullanın using :

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

Aşağıdaki kod konsol sağlayıcısı için kapsamları etkinleştirilir:

Program.cs:

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

Not

IncludeScopesKapsam tabanlı günlüğe kaydetmeyi etkinleştirmek için konsol günlükçü seçeneğinin yapılandırılması gerekir.

Yapılandırma hakkında bilgi için yapılandırma bölümüne bakın.

Her günlük iletisi kapsamlı bilgiler içerir:

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

Yerleşik günlük oluşturma sağlayıcıları

ASP.NET Core aşağıdaki sağlayıcıları sevk eder:

Stdout ve ASP.NET Core modüllü hata ayıklama günlüğü hakkında bilgi için bkz Azure App Service IIS ASP.NET Core de ASP.NET Core sorunlarını giderme . ve ASP.NET Core Modülü .

Konsol sağlayıcısı

Microsoft. Extensions. Logging. Console sağlayıcı paketi, günlük çıktısını konsola gönderir.

logging.AddConsole();

Konsol günlüğü çıkışını görmek için proje klasöründe bir komut istemi açın ve aşağıdaki komutu çalıştırın:

dotnet run

Hata ayıklama sağlayıcısı

Microsoft. Extensions. Logging. Debug sağlayıcı paketi, System. Diagnostics. Debug sınıfını (Yöntem çağrıları) kullanarak günlük çıktısını yazar Debug.WriteLine .

Linux 'ta, bu sağlayıcı günlükleri /var/log/Messagedosyasına yazar.

logging.AddDebug();

Olay kaynak sağlayıcısı

Microsoft. Extensions. Logging. EventSource sağlayıcı paketi, adıyla bir olay kaynağı çapraz platformuna yazar Microsoft-Extensions-Logging . Windows 'da, sağlayıcı ETWkullanır.

logging.AddEventSourceLogger();

Olay kaynak sağlayıcısı, CreateDefaultBuilder konağı oluşturmak için çağrıldığında otomatik olarak eklenir.

Günlükleri toplamak ve görüntülemek için PerfView yardımcı programını kullanın. ETW günlüklerini görüntülemeye yönelik başka araçlar da mevcuttur, ancak PerfView, ASP.NET Core tarafından yayınlanan ETW olaylarıyla çalışmak için en iyi deneyimi sağlar.

Bu sağlayıcı tarafından günlüğe kaydedilen olayları toplamak için PerfView 'ı yapılandırmak için, dizeyi *Microsoft-Extensions-Logging ek sağlayıcılar listesine ekleyin. (Dizenin başlangıcında yıldız işaretini kaçırmayın.)

PerfView ek sağlayıcıları

Windows olay günlüğü sağlayıcısı

Microsoft. Extensions. Logging. EventLog sağlayıcı paketi, Windows olay günlüğüne günlük çıktısı gönderir.

logging.AddEventLog();

AddEventLog aşırı yüklemeleri , geçiş yapmanızı sağlar EventLogSettings . nullVeya belirtilmemişse, aşağıdaki varsayılan ayarlar kullanılır:

  • LogName: "Uygulama"
  • SourceName: ".NET çalışma zamanı"
  • MachineName: Yerel makine adı kullanılır.

Olaylar, Uyarı düzeyi ve üzeriiçin günlüğe kaydedilir. Aşağıdaki örnek, olay günlüğü varsayılan günlük düzeyini şu şekilde ayarlar LogLevel.Information :

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

TraceSource sağlayıcısı

Microsoft. Extensions. Logging. TraceSource sağlayıcı paketi TraceSource kitaplıklarını ve sağlayıcıları kullanır.

logging.AddTraceSource(sourceSwitchName);

Addtracesource aşırı yüklemeleri , bir kaynak anahtarı ve bir izleme dinleyicisi geçirmenize olanak sağlar.

Bu sağlayıcıyı kullanmak için, bir uygulamanın .NET Framework çalışması gerekir (.NET Core yerine). Sağlayıcı, iletileri örnek uygulamada kullanılan gibi çeşitli dinleyicilerineyönlendirebilir TextWriterTraceListener .

Azure App Service sağlayıcı

Microsoft. Extensions. Logging. AzureAppServices sağlayıcı paketi, günlükleri bir Azure App Service uygulamasının dosya sistemindeki metin dosyalarına ve bir Azure depolama hesabındaki BLOB depolama alanına yazar.

logging.AddAzureWebAppDiagnostics();

Sağlayıcı paketi Microsoft. AspNetCore. app metapackage'e dahil değildir. .NET Framework veya Microsoft.AspNetCore.App metapackage 'e başvuru yaparken, sağlayıcı paketini projeye ekleyin.

AddAzureWebAppDiagnosticsAşırı yükleme, geçiş yapmanızı sağlar AzureAppServicesDiagnosticsSettings . Ayarlar nesnesi, günlük çıkış şablonu, blob adı ve dosya boyutu sınırı gibi varsayılan ayarları geçersiz kılabilir. (Çıktı şablonu , bir yöntem çağrısıyla birlikte sağlandığının yanı sıra tüm günlüklere uygulanan bir ileti şablonudur ILogger .)

App Service uygulamasına dağıtırken, uygulama, Azure portal App Service sayfasının App Service Günlükler bölümündeki ayarları kabul eder. Aşağıdaki ayarlar güncelleştirilirken, değişiklikler uygulamanın yeniden başlatılmasını veya yeniden dağıtımı gerekmeden hemen etkili olur.

  • Uygulama günlüğü (dosya sistemi)
  • Uygulama günlüğü (blob)

Günlük dosyaları için varsayılan konum D: \ Home \ LogFiles \ uygulama klasöründedir ve varsayılan dosya adı diagnostics-yyyymmdd.txt. Varsayılan dosya boyutu sınırı 10 MB 'tır ve tutulan varsayılan en fazla dosya sayısı 2 ' dir. Varsayılan blob adı {app-name} {timestamp}/yyyy/mm/dd/ss/{Guid} -applicationLog.txt.

Sağlayıcı yalnızca proje Azure ortamında çalıştırıldığında çalışır. Proje yerel olarak çalıştırıldığında, — yerel dosyalara veya blob 'lar için yerel geliştirme depolamasına yazmazsa, bu, hiçbir etkiye sahip değildir.

Azure günlük akışı

Azure günlük akışı, günlük etkinliklerini gerçek zamanlı olarak görüntülemenize izin verir:

  • Uygulama sunucusu
  • Web sunucusu
  • Başarısız istek izleme

Azure günlük akışını yapılandırmak için:

  • Uygulamanızın Portal sayfasından App Service günlükleri sayfasına gidin.
  • Uygulama günlüğünü (FileSystem) Açıkolarak ayarlayın.
  • Günlük düzeyiniseçin. Bu ayar, uygulamadaki diğer günlük sağlayıcılarını değil, yalnızca Azure günlük akışı için geçerlidir.

Uygulama iletilerini görüntülemek için günlük akışı sayfasına gidin. Uygulama tarafından arabirim aracılığıyla günlüğe kaydedilir ILogger .

Azure Application Insights izleme günlüğü

Microsoft. Extensions. Logging. ApplicationInsights sağlayıcı paketi günlükleri Azure Application Insights yazar. Application Insights, bir Web uygulamasını izleyen ve telemetri verilerini sorgulamak ve analiz etmek için araçlar sağlayan bir hizmettir. Bu sağlayıcıyı kullanıyorsanız, Application Insights araçlarını kullanarak günlüklerinizi sorgulayabilir ve analiz edebilirsiniz.

Günlüğe kaydetme sağlayıcısı, ASP.NET Core için tüm kullanılabilir telemetri sağlayan paket olan Microsoft. ApplicationInsights. AspNetCore'un bağımlılığı olarak eklenmiştir. Bu paketi kullanırsanız, sağlayıcı paketini yüklemek zorunda kalmazsınız.

ASP.NET 4. x için Microsoft. ApplicationInsights. Web paketini kullanmayın — .

Daha fazla bilgi için aşağıdaki kaynaklara bakın:

Üçüncü taraf günlük oluşturma sağlayıcıları

ASP.NET Core ile birlikte çalışan üçüncü taraf günlük çerçeveleri:

Bazı üçüncü taraf çerçeveler , yapılandırılmış günlük olarak da bilinen anlam günlüğe kaydetmeişlemini gerçekleştirebilir.

Bir üçüncü taraf çerçevesinin kullanılması, yerleşik sağlayıcılardan birini kullanmaya benzer:

  1. Projenize bir NuGet paketi ekleyin.
  2. ILoggerFactoryGünlüğe kaydetme çerçevesi tarafından sağlanmış bir genişletme yöntemi çağırın.

Daha fazla bilgi için bkz. her sağlayıcının belgeleri. Üçüncü taraf günlüğü sağlayıcıları Microsoft tarafından desteklenmez.

Ek kaynaklar