> ## Documentation Index
> Fetch the complete documentation index at: https://docs.diyanet.pro/llms.txt
> Use this file to discover all available pages before exploring further.

# BuildingBlocks.Logging.Serilog

> Serilog kurulumu — Seq sink, request logging enrichment ve gürültü filtreleme.

`BuildingBlocks.Logging.Serilog`, uygulamayı Serilog'a bağlayan iki ince extension sağlar: host'u Serilog'a yönlendirme ve HTTP request logging middleware'i. Asıl sink/enrich/filter yapılandırması `appsettings.json`'daki `Serilog` bölümünden okunur — kod tarafı minimaldir.

<Info>
  Metrik/tracing tarafı (OpenTelemetry, Prometheus) ayrıdır; bkz. [Monitoring](/building-blocks/monitoring) ve [Observability](/operations/observability).
</Info>

## Extension'lar

| Metot                                  | Tip                   | Amaç                                                      |
| -------------------------------------- | --------------------- | --------------------------------------------------------- |
| `UseToSerilog()`                       | `IHostBuilder`        | Host'u Serilog'a yönlendirir (`hostBuilder.UseSerilog()`) |
| `UseSerilogRequestLoggingMiddleware()` | `IApplicationBuilder` | HTTP request logging + `LogEnricher.EnrichFromRequest`    |

```csharp theme={null}
public static IHostBuilder UseToSerilog(this IHostBuilder hostBuilder)
{
    hostBuilder.UseSerilog();
    return hostBuilder;
}

public static IApplicationBuilder UseSerilogRequestLoggingMiddleware(this IApplicationBuilder app)
    => app.UseSerilogRequestLogging(opts => opts.EnrichDiagnosticContext = LogEnricher.EnrichFromRequest);
```

`LogEnricher.EnrichFromRequest` her istek log'una şu alanları ekler:

| Alan          | Kaynak                                   |
| ------------- | ---------------------------------------- |
| `ClientIP`    | `httpContext.Connection.RemoteIpAddress` |
| `UserAgent`   | `User-Agent` header                      |
| `Environment` | `ASPNETCORE_ENVIRONMENT`                 |

## Program.cs yerleşimi

`UseToSerilog()` host kurulumunda en başta, request logging middleware'i ise pipeline'ın erken bir noktasında çağrılır.

```csharp theme={null}
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseToSerilog();           // Serilog'u devreye al
// ... AddInfrastructure / AddApplication ...

var app = builder.Build();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSerilogRequestLoggingMiddleware();   // her HTTP isteğini özetle logla
// ... Authentication / Authorization / MapControllers ...
app.Run();
```

## appsettings — `Serilog` yapısı

Serilog `Serilog.Settings.Configuration` ile JSON'dan kurulur. Console (dev), File ve **Seq** (5341 ingest portu) sink'leri kullanılır; enrich ve gürültü filtreleri burada tanımlanır.

```json theme={null}
{
  "Serilog": {
    "Using": ["Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Sinks.Seq"],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft.AspNetCore": "Warning",
        "Microsoft.EntityFrameworkCore": "Warning",
        "MassTransit": "Warning"
      }
    },
    "Enrich": ["FromLogContext", "WithMachineName", "WithThreadId", "WithProcessId"],
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "File",
        "Args": { "path": "logs/log-.txt", "rollingInterval": "Day", "retainedFileCountLimit": 14 }
      },
      {
        "Name": "Seq",
        "Args": { "serverUrl": "http://seq:5341" }
      }
    ],
    "Filter": [
      {
        "Name": "ByExcluding",
        "Args": {
          "expression": "RequestPath like '/hc%' or RequestPath like '/metrics%' or RequestPath like '/jobs%'"
        }
      }
    ]
  }
}
```

| Bölüm                   | Amaç                                                                                       |
| ----------------------- | ------------------------------------------------------------------------------------------ |
| `MinimumLevel.Override` | Framework gürültüsünü `Warning`'e çeker; uygulama log'ları `Information` kalır             |
| `Enrich`                | `FromLogContext` (scope property'leri), `WithMachineName`, `WithThreadId`, `WithProcessId` |
| `WriteTo`               | Console + günlük rolling File + Seq                                                        |
| `Filter.ByExcluding`    | `/hc`, `/metrics`, `/jobs` gibi sağlık/metrik/dashboard yollarını log'dan çıkarır          |

<Tip>
  Dev ortamında Seq UI `5342` portunda açılır (ingest `5341`). Yapısal log sayesinde `ClientIP = '...'` veya `RequestPath like '/api/admin%'` gibi sorgularla filtreleme yapabilirsiniz.
</Tip>

<Warning>
  Hassas veriyi (parola, token, TCKN) log'a yazmayın. Domain value object'leri bu konuda yardımcıdır — örneğin `OtpCode.ToString()` daima `"******"` döner.
</Warning>

## İlgili

<CardGroup cols={2}>
  <Card title="Observability" icon="chart-line" href="/operations/observability">
    Seq, Prometheus ve Grafana yığını.
  </Card>

  <Card title="Monitoring" icon="gauge-high" href="/building-blocks/monitoring">
    OpenTelemetry metrics ve health gauge.
  </Card>

  <Card title="Operasyon" icon="server" href="/operations/overview">
    Ortam değişkenleri ve log yönetimi.
  </Card>

  <Card title="API" icon="diagram-project" href="/api/overview">
    Middleware pipeline sırası.
  </Card>
</CardGroup>
