# Options and Logging — .NET Core: Build, Test and Ship Web APIs

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

> Bind settings to a typed class and write structured logs with ILogger.

## Typed settings

The options pattern binds a configuration section to a class, so you read `options.PageSize` instead of string keys. `ILogger<T>` is injected like any other service and writes structured messages.

## Bind and use

Use message templates with named placeholders rather than string interpolation, so log systems can filter by property.

```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; }
```

## Do not log secrets

Never log passwords, tokens or full request bodies. Set minimum levels per category in `appsettings.json` so production does not drown in `Debug` messages.

**Quiz:** Why prefer `{PageSize}` placeholders over `$"{pageSize}"` in log calls?

- [ ] They compile faster
- [ ] They are required by C#
- [x] Values are kept as searchable properties
- [ ] They hide values from logs

*Answer:* Values are kept as searchable properties. Message templates keep the value separate from the text, so tools can query and filter on it.
