ASP.NET Core'da HTTP günlüğü

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

HTTP günlüğü, gelen HTTP istekleri ve HTTP yanıtları hakkındaki bilgileri günlüğe kaydeden bir ara yazılımdır. HTTP günlüğü şu günlükleri sağlar:

  • HTTP isteği bilgileri
  • Ortak özellikler
  • Üst Bilgiler
  • Gövde
  • HTTP yanıt bilgileri

HTTP günlüğü:

  • Tüm istekleri ve yanıtları veya yalnızca belirli ölçütleri karşılayan istekleri ve yanıtları günlüğe kaydetme.
  • İstek ve yanıtın hangi bölümlerinin günlüğe kaydedildiği seçin.
  • Günlüklerden hassas bilgileri yeniden düzenlemenize olanak sağlar.

HTTP günlüğü , özellikle istek ve yanıt gövdelerini günlüğe kaydetme sırasında uygulamanın performansını düşürebilir. Günlüğe kaydedilecek alanları seçerken performans etkisini göz önünde bulundurun. Seçili günlük özelliklerinin performans etkisini test edin.

Uyarı

HTTP günlüğü, kişisel bilgileri (PII) günlüğe kaydedebilir. Riski göz önünde bulundurun ve hassas bilgileri günlüğe kaydetmekten kaçının.

HTTP günlüğünü etkinleştirme

HTTP günlüğü, aşağıdaki örnekte gösterildiği gibi ve UseHttpLoggingçağrılarak AddHttpLogging etkinleştirilir:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpLogging(o => { });

var app = builder.Build();

app.UseHttpLogging();

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

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

app.Run();

Önceki çağrı AddHttpLogging örneğindeki boş lambda, ara yazılımı varsayılan yapılandırmayla ekler. Varsayılan olarak, HTTP günlüğü istekler ve yanıtlar için yol, durum kodu ve üst bilgiler gibi ortak özellikleri günlüğe kaydeder.

HTTP günlüklerinin görüntülenmesi için appsettings.Development.json dosyasına "LogLevel": { düzeyinde aşağıdaki satırı ekleyin:

 "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information"

Varsayılan yapılandırmada, istek ve yanıt aşağıdaki örneğe benzer bir ileti çifti olarak günlüğe kaydedilir:

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]
      Request:
      Protocol: HTTP/2
      Method: GET
      Scheme: https
      PathBase:
      Path: /
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
      Host: localhost:52941
      User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.61
      Accept-Encoding: gzip, deflate, br
      Accept-Language: en-US,en;q=0.9
      Upgrade-Insecure-Requests: [Redacted]
      sec-ch-ua: [Redacted]
      sec-ch-ua-mobile: [Redacted]
      sec-ch-ua-platform: [Redacted]
      sec-fetch-site: [Redacted]
      sec-fetch-mode: [Redacted]
      sec-fetch-user: [Redacted]
      sec-fetch-dest: [Redacted]
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]
      Response:
      StatusCode: 200
      Content-Type: text/plain; charset=utf-8
      Date: Tue, 24 Oct 2023 02:03:53 GMT
      Server: Kestrel

HTTP günlük seçenekleri

HTTP günlüğe kaydetme ara yazılımı için genel seçenekleri yapılandırmak için, AddHttpLoggingProgram.cslambda kullanarak komutunu çağırın HttpLoggingOptions.

using Microsoft.AspNetCore.HttpLogging;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpLogging(logging =>
{
    logging.LoggingFields = HttpLoggingFields.All;
    logging.RequestHeaders.Add("sec-ch-ua");
    logging.ResponseHeaders.Add("MyResponseHeader");
    logging.MediaTypeOptions.AddText("application/javascript");
    logging.RequestBodyLogLimit = 4096;
    logging.ResponseBodyLogLimit = 4096;
    logging.CombineLogs = true;
});

var app = builder.Build();

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

app.UseStaticFiles();

app.UseHttpLogging(); 

app.Use(async (context, next) =>
{
    context.Response.Headers["MyResponseHeader"] =
        new string[] { "My Response Header Value" };

    await next();
});

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

app.Run();

Not

Yukarıdaki örnekte ve aşağıdaki örneklerde, 'den sonra UseStaticFilesçağrılır, UseHttpLogging bu nedenle statik dosyalar için HTTP günlüğü etkinleştirilmez. Statik dosya HTTP günlüğünü etkinleştirmek için önce UseStaticFilesöğesini arayınUseHttpLogging.

LoggingFields

HttpLoggingOptions.LoggingFields, isteğin belirli bölümlerini yapılandıran ve günlüğe yanıt veren bir sabit listesi bayrağıdır. HttpLoggingOptions.LoggingFields varsayılan olarak RequestPropertiesAndHeaders | ResponsePropertiesAndHeaders şeklinde ayarlanır.

RequestHeaders ve ResponseHeaders

RequestHeaders ve ResponseHeaders günlüğe kaydedilen HTTP üst bilgi kümeleridir. Üst bilgi değerleri yalnızca bu koleksiyonlardaki üst bilgi adları için günlüğe kaydedilir. Aşağıdaki kod öğesine ekler sec-ch-uaRequestHeaders, böylece üst bilginin değeri sec-ch-ua günlüğe kaydedilir. Üst bilginin değeri MyResponseHeader günlüğe ResponseHeaderskaydedilecek şekilde öğesine eklenirMyResponseHeader. Bu satırlar kaldırılırsa, bu üst bilgilerin değerleri olur [Redacted].

using Microsoft.AspNetCore.HttpLogging;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpLogging(logging =>
{
    logging.LoggingFields = HttpLoggingFields.All;
    logging.RequestHeaders.Add("sec-ch-ua");
    logging.ResponseHeaders.Add("MyResponseHeader");
    logging.MediaTypeOptions.AddText("application/javascript");
    logging.RequestBodyLogLimit = 4096;
    logging.ResponseBodyLogLimit = 4096;
    logging.CombineLogs = true;
});

var app = builder.Build();

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

app.UseStaticFiles();

app.UseHttpLogging(); 

app.Use(async (context, next) =>
{
    context.Response.Headers["MyResponseHeader"] =
        new string[] { "My Response Header Value" };

    await next();
});

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

app.Run();

MediaTypeOptions

MediaTypeOptions belirli bir medya türü için hangi kodlamanın kullanılacağını seçmek üzere yapılandırma sağlar.

using Microsoft.AspNetCore.HttpLogging;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpLogging(logging =>
{
    logging.LoggingFields = HttpLoggingFields.All;
    logging.RequestHeaders.Add("sec-ch-ua");
    logging.ResponseHeaders.Add("MyResponseHeader");
    logging.MediaTypeOptions.AddText("application/javascript");
    logging.RequestBodyLogLimit = 4096;
    logging.ResponseBodyLogLimit = 4096;
    logging.CombineLogs = true;
});

var app = builder.Build();

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

app.UseStaticFiles();

app.UseHttpLogging(); 

app.Use(async (context, next) =>
{
    context.Response.Headers["MyResponseHeader"] =
        new string[] { "My Response Header Value" };

    await next();
});

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

app.Run();

Bu yaklaşım, varsayılan olarak günlüğe kaydedilmeyen veriler için günlüğe kaydetmeyi etkinleştirmek için de kullanılabilir (örneğin, veya multipart/form-datagibi application/x-www-form-urlencoded bir medya türüne sahip olabilecek form verileri).

MediaTypeOptions yöntemleri

RequestBodyLogLimit ve ResponseBodyLogLimit

using Microsoft.AspNetCore.HttpLogging;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpLogging(logging =>
{
    logging.LoggingFields = HttpLoggingFields.All;
    logging.RequestHeaders.Add("sec-ch-ua");
    logging.ResponseHeaders.Add("MyResponseHeader");
    logging.MediaTypeOptions.AddText("application/javascript");
    logging.RequestBodyLogLimit = 4096;
    logging.ResponseBodyLogLimit = 4096;
    logging.CombineLogs = true;
});

var app = builder.Build();

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

app.UseStaticFiles();

app.UseHttpLogging(); 

app.Use(async (context, next) =>
{
    context.Response.Headers["MyResponseHeader"] =
        new string[] { "My Response Header Value" };

    await next();
});

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

app.Run();

CombineLogs

ayarı CombineLogstrue , ara yazılımı bir istek ve yanıt için etkinleştirilen tüm günlüklerini sonundaki tek bir günlükte birleştirecek şekilde yapılandırıyor. Buna istek, istek gövdesi, yanıt, yanıt gövdesi ve süre dahildir.

using Microsoft.AspNetCore.HttpLogging;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpLogging(logging =>
{
    logging.LoggingFields = HttpLoggingFields.All;
    logging.RequestHeaders.Add("sec-ch-ua");
    logging.ResponseHeaders.Add("MyResponseHeader");
    logging.MediaTypeOptions.AddText("application/javascript");
    logging.RequestBodyLogLimit = 4096;
    logging.ResponseBodyLogLimit = 4096;
    logging.CombineLogs = true;
});

var app = builder.Build();

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

app.UseStaticFiles();

app.UseHttpLogging(); 

app.Use(async (context, next) =>
{
    context.Response.Headers["MyResponseHeader"] =
        new string[] { "My Response Header Value" };

    await next();
});

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

app.Run();

Uç noktaya özgü yapılandırma

En düşük API uygulamalarında uç noktaya özgü yapılandırma için bir WithHttpLogging uzantı yöntemi kullanılabilir. Aşağıdaki örnekte, bir uç nokta için HTTP günlüğünü yapılandırma işlemi gösterilmektedir:

app.MapGet("/response", () => "Hello World! (logging response)")
    .WithHttpLogging(HttpLoggingFields.ResponsePropertiesAndHeaders);

Denetleyici kullanan uygulamalarda uç noktaya özgü yapılandırma için [HttpLogging] özniteliği kullanılabilir. Öznitelik, aşağıdaki örnekte gösterildiği gibi minimum API uygulamalarında da kullanılabilir:

app.MapGet("/duration", [HttpLogging(loggingFields: HttpLoggingFields.Duration)]
    () => "Hello World! (logging duration)");

IHttpLoggingInterceptor

IHttpLoggingInterceptor , günlüğe kaydedilen ayrıntıları özelleştirmek için istek başına ve yanıt başına geri çağırmaları işlemek için uygulanabilen bir hizmetin arabirimidir. Uç noktaya özgü günlük ayarları önce uygulanır ve daha sonra bu geri çağırmalarda geçersiz kılınabilir. Bir uygulama:

  • bir isteği veya yanıtı inceleyin.
  • Herhangi bir HttpLoggingFieldsöğesini etkinleştirin veya devre dışı bırakın.
  • İstek veya yanıt gövdesinin ne kadarının günlüğe kaydedilmiş olduğunu ayarlayın.
  • Günlüklere özel alanlar ekleyin.

içinde Program.csçağrısı AddHttpLoggingInterceptor<T> yaparak bir IHttpLoggingInterceptor uygulamayı kaydedin. Birden çok IHttpLoggingInterceptor örnek kayıtlıysa, bunlar kayıtlı sırayla çalıştırılır.

Aşağıdaki örnekte bir IHttpLoggingInterceptor uygulamanın nasıl kaydedilecekleri gösterilmektedir:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpLogging(logging =>
{
    logging.LoggingFields = HttpLoggingFields.Duration;
});
builder.Services.AddHttpLoggingInterceptor<SampleHttpLoggingInterceptor>();

Aşağıdaki örnek şu şekilde bir IHttpLoggingInterceptor uygulamadır:

  • İstek yöntemini inceler ve POST istekleri için günlüğe kaydetmeyi devre dışı bırakır.
  • POST olmayan istekler için:
    • İstek yolunu, istek üst bilgilerini ve yanıt üst bilgilerini yeniden düzenler.
    • İstek ve yanıt günlüklerine özel alanlar ve alan değerleri ekler.
using Microsoft.AspNetCore.HttpLogging;

namespace HttpLoggingSample;

internal sealed class SampleHttpLoggingInterceptor : IHttpLoggingInterceptor
{
    public ValueTask OnRequestAsync(HttpLoggingInterceptorContext logContext)
    {
        if (logContext.HttpContext.Request.Method == "POST")
        {
            // Don't log anything if the request is a POST.
            logContext.LoggingFields = HttpLoggingFields.None;
        }

        // Don't enrich if we're not going to log any part of the request.
        if (!logContext.IsAnyEnabled(HttpLoggingFields.Request))
        {
            return default;
        }

        if (logContext.TryDisable(HttpLoggingFields.RequestPath))
        {
            RedactPath(logContext);
        }

        if (logContext.TryDisable(HttpLoggingFields.RequestHeaders))
        {
            RedactRequestHeaders(logContext);
        }

        EnrichRequest(logContext);

        return default;
    }

    public ValueTask OnResponseAsync(HttpLoggingInterceptorContext logContext)
    {
        // Don't enrich if we're not going to log any part of the response
        if (!logContext.IsAnyEnabled(HttpLoggingFields.Response))
        {
            return default;
        }

        if (logContext.TryDisable(HttpLoggingFields.ResponseHeaders))
        {
            RedactResponseHeaders(logContext);
        }

        EnrichResponse(logContext);

        return default;
    }

    private void RedactPath(HttpLoggingInterceptorContext logContext)
    {
        logContext.AddParameter(nameof(logContext.HttpContext.Request.Path), "RedactedPath");
    }

    private void RedactRequestHeaders(HttpLoggingInterceptorContext logContext)
    {
        foreach (var header in logContext.HttpContext.Request.Headers)
        {
            logContext.AddParameter(header.Key, "RedactedHeader");
        }
    }

    private void EnrichRequest(HttpLoggingInterceptorContext logContext)
    {
        logContext.AddParameter("RequestEnrichment", "Stuff");
    }

    private void RedactResponseHeaders(HttpLoggingInterceptorContext logContext)
    {
        foreach (var header in logContext.HttpContext.Response.Headers)
        {
            logContext.AddParameter(header.Key, "RedactedHeader");
        }
    }

    private void EnrichResponse(HttpLoggingInterceptorContext logContext)
    {
        logContext.AddParameter("ResponseEnrichment", "Stuff");
    }
}

Bu kesme noktası ile, HTTP günlüğü günlüğe kaydetmek üzere yapılandırılmış olsa bile post isteği herhangi bir günlük HttpLoggingFields.Alloluşturmaz. GET isteği aşağıdaki örneğe benzer günlükler oluşturur:

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]
      Request:
      Path: RedactedPath
      Accept: RedactedHeader
      Host: RedactedHeader
      User-Agent: RedactedHeader
      Accept-Encoding: RedactedHeader
      Accept-Language: RedactedHeader
      Upgrade-Insecure-Requests: RedactedHeader
      sec-ch-ua: RedactedHeader
      sec-ch-ua-mobile: RedactedHeader
      sec-ch-ua-platform: RedactedHeader
      sec-fetch-site: RedactedHeader
      sec-fetch-mode: RedactedHeader
      sec-fetch-user: RedactedHeader
      sec-fetch-dest: RedactedHeader
      RequestEnrichment: Stuff
      Protocol: HTTP/2
      Method: GET
      Scheme: https
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]
      Response:
      Content-Type: RedactedHeader
      MyResponseHeader: RedactedHeader
      ResponseEnrichment: Stuff
      StatusCode: 200
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[4]
      ResponseBody: Hello World!
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[8]
      Duration: 2.2778ms

Öncelik yapılandırma sırasını günlüğe kaydetme

Aşağıdaki listede günlük yapılandırması için öncelik sırası gösterilmektedir:

  1. 'den HttpLoggingOptionsgenel yapılandırma çağrısı AddHttpLoggingyaparak ayarlayın.
  2. Özniteliğinden veya uzantı yönteminden [HttpLogging] uç noktaya özgü yapılandırma, genel yapılandırmayı WithHttpLogging geçersiz kılar.
  3. IHttpLoggingInterceptor sonuçlarla birlikte çağrılır ve istek başına yapılandırmayı daha fazla değiştirebilir.

HTTP Günlüğü, gelen HTTP istekleri ve HTTP yanıtları hakkındaki bilgileri günlüğe kaydeden bir ara yazılımdır. HTTP günlüğü şu günlükleri sağlar:

  • HTTP isteği bilgileri
  • Ortak özellikler
  • Üst Bilgiler
  • Gövde
  • HTTP yanıt bilgileri

HTTP Günlüğü, aşağıdakiler için çeşitli senaryolarda değerlidir:

  • Gelen istekler ve yanıtlar hakkındaki bilgileri kaydetme.
  • İsteğin ve yanıtın hangi bölümlerinin günlüğe kaydedildiği filtreleme.
  • Günlüğe kaydedilecek üst bilgileri filtreleme.

HTTP Günlüğü, özellikle istek ve yanıt gövdelerini günlüğe kaydettiğinizde uygulamanın performansını azaltabilir. Günlüğe kaydedilecek alanları seçerken performans etkisini göz önünde bulundurun. Seçili günlük özelliklerinin performans etkisini test edin.

Uyarı

HTTP Günlüğü potansiyel olarak kişisel bilgileri (PII) günlüğe kaydedebilir. Riski göz önünde bulundurun ve hassas bilgileri günlüğe kaydetmekten kaçının.

HTTP günlüğünü etkinleştirme

HTTP Günlüğü, http günlüğü ara yazılımını ekleyen UseHttpLogging ile etkinleştirilir.

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

app.UseHttpLogging();

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

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

app.Run();

Varsayılan olarak, HTTP Günlüğü, istekler ve yanıtlar için yol, durum kodu ve üst bilgiler gibi ortak özellikleri günlüğe kaydeder. HTTP günlüklerinin görüntülenmesi için appsettings.Development.json dosyasına "LogLevel": { düzeyinde aşağıdaki satırı ekleyin:

 "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information"

Çıkış, LogLevel.Information konumunda tek bir ileti olarak günlüğe kaydedilir.

Örnek istek çıkışı

HTTP Günlüğü seçenekleri

HTTP günlüğü ara yazılımını yapılandırmak Program.cs içinden AddHttpLogging çağırın.

using Microsoft.AspNetCore.HttpLogging;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpLogging(logging =>
{
    logging.LoggingFields = HttpLoggingFields.All;
    logging.RequestHeaders.Add("sec-ch-ua");
    logging.ResponseHeaders.Add("MyResponseHeader");
    logging.MediaTypeOptions.AddText("application/javascript");
    logging.RequestBodyLogLimit = 4096;
    logging.ResponseBodyLogLimit = 4096;

});

var app = builder.Build();

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

app.UseStaticFiles();

app.UseHttpLogging(); 

app.Use(async (context, next) =>
{
    context.Response.Headers["MyResponseHeader"] =
        new string[] { "My Response Header Value" };

    await next();
});

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

app.Run();

Not

Yukarıdaki örnekte ve aşağıdaki örneklerde, 'den sonra UseStaticFilesçağrılır, UseHttpLogging bu nedenle statik dosya için HTTP günlüğü etkinleştirilmez. Statik dosya HTTP günlüğünü etkinleştirmek için önce UseStaticFilesöğesini arayınUseHttpLogging.

LoggingFields

HttpLoggingOptions.LoggingFields, isteğin belirli bölümlerini yapılandıran ve günlüğe yanıt veren bir sabit listesi bayrağıdır. HttpLoggingOptions.LoggingFields varsayılan olarak RequestPropertiesAndHeaders | ResponsePropertiesAndHeaders şeklinde ayarlanır.

RequestHeaders

Headers günlüğe kaydedilmesine izin verilen bir dizi HTTP İsteği Üst Bilgisidir. Üst bilgi değerleri yalnızca bu koleksiyondaki üst bilgi adları için günlüğe kaydedilir. Aşağıdaki kod "sec-ch-ua" istek üst bilgisini günlüğe kaydeder. logging.RequestHeaders.Add("sec-ch-ua"); kaldırılırsa, "sec-ch-ua" istek üst bilgisinin değeri yeniden oluşturulur. Aşağıdaki vurgulanan kod HttpLoggingOptions.RequestHeaders ve HttpLoggingOptions.ResponseHeaders özelliğini çağırır :

using Microsoft.AspNetCore.HttpLogging;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpLogging(logging =>
{
    logging.LoggingFields = HttpLoggingFields.All;
    logging.RequestHeaders.Add("sec-ch-ua");
    logging.ResponseHeaders.Add("MyResponseHeader");
    logging.MediaTypeOptions.AddText("application/javascript");
    logging.RequestBodyLogLimit = 4096;
    logging.ResponseBodyLogLimit = 4096;

});

var app = builder.Build();

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

app.UseStaticFiles();

app.UseHttpLogging(); 

app.Use(async (context, next) =>
{
    context.Response.Headers["MyResponseHeader"] =
        new string[] { "My Response Header Value" };

    await next();
});

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

app.Run();

MediaTypeOptions

MediaTypeOptions belirli bir medya türü için hangi kodlamanın kullanılacağını seçmek üzere yapılandırma sağlar.

using Microsoft.AspNetCore.HttpLogging;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpLogging(logging =>
{
    logging.LoggingFields = HttpLoggingFields.All;
    logging.RequestHeaders.Add("sec-ch-ua");
    logging.ResponseHeaders.Add("MyResponseHeader");
    logging.MediaTypeOptions.AddText("application/javascript");
    logging.RequestBodyLogLimit = 4096;
    logging.ResponseBodyLogLimit = 4096;

});

var app = builder.Build();

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

app.UseStaticFiles();

app.UseHttpLogging(); 

app.Use(async (context, next) =>
{
    context.Response.Headers["MyResponseHeader"] =
        new string[] { "My Response Header Value" };

    await next();
});

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

app.Run();

Bu yaklaşım, varsayılan olarak günlüğe kaydedilmemiş veriler için günlüğe kaydetmeyi etkinleştirmek için de kullanılabilir (örneğin, veya multipart/form-datagibi application/x-www-form-urlencoded bir medya türüne sahip olabilecek form verileri).

MediaTypeOptions yöntemleri

RequestBodyLogLimit ve ResponseBodyLogLimit

using Microsoft.AspNetCore.HttpLogging;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpLogging(logging =>
{
    logging.LoggingFields = HttpLoggingFields.All;
    logging.RequestHeaders.Add("sec-ch-ua");
    logging.ResponseHeaders.Add("MyResponseHeader");
    logging.MediaTypeOptions.AddText("application/javascript");
    logging.RequestBodyLogLimit = 4096;
    logging.ResponseBodyLogLimit = 4096;

});

var app = builder.Build();

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

app.UseStaticFiles();

app.UseHttpLogging(); 

app.Use(async (context, next) =>
{
    context.Response.Headers["MyResponseHeader"] =
        new string[] { "My Response Header Value" };

    await next();
});

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

app.Run();