Bu kütüphane Request Loglama için geliştirilmiştir.
$ dotnet add package Appouse.RequestLogging// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
var cs = "Host=127.0.0.1;Username=app;Password=***;Database=logs";
var writer = new ChannelLogWriter(new PostgresLogWriter(cs));
services.AddRequestLogging(new RequestLoggingOptions
{
Application = "BizimPortal",
Environment = "Prod",
Writer = writer,
// SqlServerArchiveStore / OracleArchiveStore / MySqlArchiveStore olarak da kullanabilirsiniz
Ayn ekilde arşivleme tarafnda da ilgili ArchiveStore snflarn kullanabilirsiniz.
// Properties – opsiyonel provider(lar)
PropertyProviders = { ctx => new[] {
new KeyValuePair<string,string>("appVersion","1.2.3"),
new KeyValuePair<string,string>("region","eu-central")
}},
// Arşivleme
EnableArchiver = true,
ArchiveMode = ArchiveMode.Daily, // Never/Daily/Monthly/Yearly
HotRetention = TimeSpan.FromDays(7), // aktif tabloda 7 gün kalsın
ArchiveInterval = TimeSpan.FromMinutes(5),
ArchiveBatchSize = 5000,
ArchiveStore = new Appouse.RequestLogging.Archiving.PostgresArchiveStore(cs)
});
}
public void Configure(IApplicationBuilder app)
{
app.UseRequestLogging();
// ... diğer middleware
}
Diğer DB’ler için sadece PostgresLogWriter yerine SqlServerLogWriter / OracleLogWriter / MySqlLogWriter verebilirsiniz.
İstek header’ında X-Correlation-ID varsa korunur, yoksa oluşturulup yanıta da eklenir.
Mikroservisler arası yaymak için HttpClient’e delegating handler ekleyebilirsin:
public class CorrelationHandler : DelegatingHandler
{
private readonly IHttpContextAccessor _http;
public CorrelationHandler(IHttpContextAccessor http) => _http = http;
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage req, CancellationToken ct)
{
var cid = _http.HttpContext?.Request.Headers["X-Correlation-ID"].ToString();
if (!string.IsNullOrEmpty(cid))
req.Headers.TryAddWithoutValidation("X-Correlation-ID", cid);
return base.SendAsync(req, ct);
}
}
[LogFlatten]
public class LoginRequest
{
public string UserName { get; set; }
[LogMask("******", keepLast:2)] public string Password { get; set; }
[LogIgnore] public byte[]? AvatarBytes { get; set; }
[LogRename("phone")] public string? PhoneNumber { get; set; }
}
RequestLogProperties.Add(HttpContext, "orderId", orderId.ToString());
RequestLogProperties.Add(HttpContext, "featureFlag", flag);
HOSTNAME genelde pod adıdır. KUBERNETES_* env değişkenlerini Downward API ile enjekte edip otomatik toplanır.*_preview kolonlarını boş bırakabilirsiniz.MaskHeaders ile otomatik maske edilir.ChannelLogWriter ile sarmalayın.DELETE FROM request_log_archive WHERE timestamp_utc < now() - interval '30 days' benzeri bir temizlik çalıştırın. Bu jon sadece Arşivleme üstünde çalışmalıdır. Misal, log tablosu 7 gün, arşiv tablosu 1 ay tutabilir. Cron job arşiv tablosundan 1 aydan eski kayıtları siler.