.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ı:
- Genel Konağıkullanın.
- CreateDefaultBuilderAşağıdaki günlük sağlayıcılarını ekleyen çağırın:
- Konsol
- Hata ayıklama
- EventSource
- EventLog: yalnızca Windows
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:
- ClearProvidersOluşturucunun tüm örneklerini kaldırmak için çağırır ILoggerProvider .
- Konsol günlüğü sağlayıcısını ekler.
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ştururAboutModel. 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üzeyindekiWarningve 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
LogLevelWindows 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 ayarlarLogging.LogLevel. Örneğin, içindeki düzeyiDebug.LogLevel.Defaultiçindeki düzeyi geçersiz kılarLogLevel.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:MicrosoftWindows üzerinde bir değeri olarak ayarlayınInformation. - 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ı gerekirset.
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,
TraceInformationyüksek hacimli ayrıntılı günlük iletileri oluşturur. Maliyetleri denetlemek ve veri depolama sınırlarını aşmamak için,TraceInformationiletileri yüksek hacimli ve düşük maliyetli bir veri deposuna günlüğe kaydedin.TraceBelirli kategorileri ve sınırlamayı değerlendirinInformation. - Düzeylerde oturum açma,
WarningCriticalbirkaç 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.
- Veya düzeylerinde günlüğe kaydetme,
- Geliştirme aşamasında:
Warningolarak ayarlayın.TraceInformationSorun giderirken veya ileti ekleyin. Çıktıyı sınırlandırmak için,TraceInformationyalnı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ümesi
Logging: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ığı
IDve özellikleri olabilirRequestTime. - Özellikleri olan tablolar günlüğe kaydedilen verilerde sorguları basitleştirir. Örneğin, bir sorgu belirli bir aralıktaki tüm günlükleri,
RequestTimekı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:
- IDisposable, Yöntemi tarafından döndürülen türdür BeginScope .
- Atılana kadar sürer.
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:
- Konsol
- Hata ayıklama
- EventSource
- EventLog
- AzureAppServicesFile ve AzureAppServicesBlob
- ApplicationInsights
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:
Komutuyla uygulamayı çalıştırın
dotnet run..NET Core uygulamasının işlem tanımlayıcısını (PID) belirleme:
- Windows 'ta aşağıdaki yaklaşımlardan birini kullanın:
- Görev Yöneticisi (Ctrl + Alt + Del)
- Tasklist komutu
- Get-Process PowerShell komutu
- Linux 'ta pidof komutunukullanın.
Uygulamanın derlemesi ile aynı ada sahip olan işlem için PID 'i bulun.
- Windows 'ta aşağıdaki yaklaşımlardan birini kullanın:
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,
--providersdeğ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 ekleyinspeedscope.Sözcükle Açıklama 1 İçin meta olayları günlüğe kaydedin LoggingEventSource. Olayları günlüğe kaydetmezILogger).2 MessageÇağrıldığında olayı açarILogger.Log(). Programlı (biçimlendirilmedi) bir şekilde bilgi sağlar.4 FormatMessageÇağrıldığında olayı açarILogger.Log(). , Bilgilerin biçimlendirilen dize sürümünü sağlar.8 MessageJsonÇağrıldığında olayı açarILogger.Log(). Bağımsız değişkenlerin JSON gösterimini sağlar.Olay düzeyi Description 0 LogAlways1 Critical2 Error3 Warning4 Informational5 VerboseFilterSpecsiç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 kaydetmeInformationaldüzeyinde () günlüğe kaydetme4.
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.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.
- Performans Analizi yardımcı programı Için izleme (DotNet-Trace) (.NET Core belgeleri)
- Performans Analizi yardımcı programı (DotNet-Trace) Için izleme (DotNet/Diagnostics GitHub deposu belgeleri)
- Loggingeventsource sınıfı (.NET API tarayıcısı)
- EventLevel
- Loggingeventsource başvuru kaynağı (3,0): farklı bir sürüm için başvuru kaynağı almak için dalı olarak değiştirin
release/{Version}, burada{Version}ASP.NET Core sürümü istenen sürümdür. - PerfView: olay kaynağı izlemelerini görüntülemek için yararlıdır.
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:
- Application Insights'a genel bakış
- ASP.NET Core uygulamalar için Application Insights -günlük kaydı ile birlikte Application Insights telemetrinin tam aralığını uygulamak istiyorsanız buraya başlayın.
- .NET Core ILogger günlükleri Için Applicationınsightsloggerprovider -günlük sağlayıcısını Application Insights telemetri olmadan uygulamak istiyorsanız buraya başlayın.
- Günlüğe kaydetme bağdaştırıcılarını Application Insights.
- Microsoft Learn sitede Application Insights SDK-etkileşimli öğreticisini yükleyip başlatı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:
- ELMAH.io (GitHub deposu)
- Gelf (GitHub deposu)
- Jsnlog (GitHub deposu)
- KissLog.net (GitHub deposu)
- Log4Net (GitHub deposu)
- Loggr (GitHub deposu)
- NLog (GitHub deposu)
- Pgünlükçü (GitHub deposu)
- Sentry (GitHub deposu)
- Serilog (GitHub deposu)
- Stackdriver (GitHub deposu)
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:
- Projenize bir NuGet paketi ekleyin.
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
Startupdesteklenmiyor. - Yöntem imzasına günlükçü ekleme
Startup.ConfigureServicesdesteklenmiyor
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:
- Arabirimler Microsoft. Extensions. Logging. soyutlamalariçinde bulunur.
- Varsayılan uygulamalar Microsoft. Extensions. Logging' dir.
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
Informationve ü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.LogLevelederIsEnabled, her birininlogLevelbenzersiz 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
- ASP.NET Core 'de LoggerMessage ile yüksek performanslı günlüğe kaydetme
- Günlüğe kaydetme hataları GitHub.com/DotNet/Runtime/ deposu 'nda oluşturulmalıdır.
- ASP.NET Core Blazor açmak
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.Debugyü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/todoUyarı = 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,
TraceInformationyüksek hacimli ayrıntılı günlük iletileri oluşturur. Maliyetleri denetlemek ve veri depolama sınırlarını aşmamak için,TraceInformationdüzey iletiler üzerinden yüksek hacimli, düşük maliyetli bir veri deposuna oturum açın. - Düzeylerde oturum açma işlemi
WarningCriticalgenellikle 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.
- Geçiş düzeyinde günlüğe kaydetme,
- Geliştirme sırasında:
WarningKonsola iletiler aracılığıyla oturum açınCritical.TraceInformationSorun 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:
- Konsol
- Hata ayıklama
- EventSource
- EventLog
- TraceSource
- AzureAppServicesFile
- AzureAppServicesBlob
- ApplicationInsights
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.)

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:
- Application Insights'a genel bakış
- ASP.NET Core uygulamalar için Application Insights -günlük kaydı ile birlikte Application Insights telemetrinin tam aralığını uygulamak istiyorsanız buraya başlayın.
- .NET Core ILogger günlükleri Için Applicationınsightsloggerprovider -günlük sağlayıcısını Application Insights telemetri olmadan uygulamak istiyorsanız buraya başlayın.
- Günlüğe kaydetme bağdaştırıcılarını Application Insights.
- Microsoft Learn sitede Application Insights SDK-etkileşimli öğreticisini yükleyip başlatı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:
- ELMAH.io (GitHub deposu)
- Gelf (GitHub deposu)
- Jsnlog (GitHub deposu)
- KissLog.net (GitHub deposu)
- Log4Net (GitHub deposu)
- Loggr (GitHub deposu)
- NLog (GitHub deposu)
- Sentry (GitHub deposu)
- Serilog (GitHub deposu)
- Stackdriver (GitHub deposu)
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:
- Projenize bir NuGet paketi ekleyin.
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.