# Options और Logging — .NET Core: वेब API बनाएँ, टेस्ट करें और शिप करें

Source: https://www.geekswithgeeks.com/hi/dotnet-core/di-options-logging

> Settings को typed class से bind करें और ILogger से structured logs लिखें।

## Typed settings

Options pattern किसी configuration section को class से bind करता है, तो string keys की जगह `options.PageSize` पढ़ते हैं। `ILogger<T>` किसी भी अन्य service की तरह inject होता है और structured messages लिखता है।

## Bind करें और उपयोग करें

String interpolation की जगह नामित placeholders वाले message templates उपयोग करें, ताकि log systems property से filter कर सकें।

```csharp
builder.Services.Configure<ShopOptions>(builder.Configuration.GetSection("Shop"));

app.MapGet("/size", (IOptions<ShopOptions> opt, ILogger<Program> log) =>
{
    log.LogInformation("Page size is {PageSize}", opt.Value.PageSize);
    return opt.Value.PageSize;
});

public class ShopOptions { public int PageSize { get; set; } = 20; }
```

## Secrets log न करें

Passwords, tokens या पूरी request bodies कभी log न करें। `appsettings.json` में category-वार न्यूनतम levels तय करें ताकि production में `Debug` messages की बाढ़ न आए।

**Quiz:** Log calls में `$"{pageSize}"` की जगह `{PageSize}` placeholders क्यों बेहतर हैं?

- [ ] वे तेज़ compile होते हैं
- [ ] C# में ज़रूरी हैं
- [x] Values खोजने योग्य properties के रूप में रहती हैं
- [ ] वे values को logs से छिपाते हैं

*Answer:* Values खोजने योग्य properties के रूप में रहती हैं. Message templates value को text से अलग रखते हैं, जिससे tools उस पर query और filter कर सकते हैं।
