| Package | Version | Downloads |
|---|---|---|
| SimplyWorks.Logger.ElasticSearch | ||
| SimplyWorks.Logger.Console |
SW-Logger is a .NET logging library built on top of Serilog that provides structured logging capabilities for .NET 8.0 applications. It offers two main logging sinks:
- Console Logger: Provides enhanced console logging with structured output and request context enrichment
- ElasticSearch Logger: Enables logging to ElasticSearch with data streams, lifecycle policies, and correlation tracking
- 🎯 Structured Logging: Built on Serilog for structured, searchable logs
- 🔍 Request Context Enrichment: Automatically enriches logs with correlation IDs and user information
- 🗂️ ElasticSearch Integration: Direct logging to ElasticSearch with data streams and index lifecycle management
- 📊 Console Logging: Enhanced console output with JSON formatting in production
- ⚙️ Configuration-Driven: Flexible configuration through
appsettings.json - 🔄 Request Logging: Built-in HTTP request/response logging
- 🏷️ Environment Support: Environment-specific logging configurations
dotnet add package SimplyWorks.Logger.Consoledotnet add package SimplyWorks.Logger.ElasticSearchusing SW.Logger.Console;
public void ConfigureServices(IServiceCollection services)
{
services.AddSWConsoleLogger(options =>
{
options.ApplicationName = "MyApp";
options.LoggingLevel = 2; // Information (the default)
});
}public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseSWConsoleLogger();
// ... other middleware
}using SW.Logger.ElasticSerach;
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseSwElasticSearchLogger(options =>
{
options.ApplicationName = "MyApp";
options.ElasticsearchUrl = "https://localhost:9200";
});public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRequestContextLogEnricher();
// ... other middleware
}{
"SwLogger": {
"ApplicationName": "MyApplication",
"LoggingLevel": 2,
"ElasticsearchUrl": "https://localhost:9200",
"ElasticsearchUser": "elastic",
"ElasticsearchPassword": "password",
"ElasticsearchEnvironments": "Development,Staging,Production",
"ElasticsearchCertificatePath": "/path/to/certificate.crt",
"ElasticsearchDeleteIndexAfterDays": 90
}
}ApplicationName: Name of your application (default: "unknownapp")ApplicationVersion: Version of your application (auto-detected from assembly)LoggingLevel: Minimum level as Serilog'sLogEventLevelnumber: 0=Verbose, 1=Debug, 2=Information (default), 3=Warning, 4=Error, 5=Fatal.Microsoft.AspNetCoreandMicrosoft.EntityFrameworkCoreare always held at Warning.Environments: Comma-separated list of environments where logging is activeLogRequests: Write one line per HTTP request with its duration, status and aRouteproperty holding the route template (/api/orders/{id}), so requests can be grouped per endpoint. Kept even whenLoggingLevelis above Information. Defaulttrue.SlowQueryMilliseconds: EF Core commands taking at least this long are logged ("Executed DbCommand (Nms)"), so a slow request can be traced to its query; faster ones are not logged. Failed commands always are.0disables. Default500.QuietRequestPaths: Comma-separated path prefixes whose successful requests are dropped (default/health,/healthz,/metrics). Failures are still logged.
Upgrading: before this change
LoggingLeveldefaulted to 1, which is Debug, not Information as this README claimed. Apps that never set it now log at Information, and framework chatter from ASP.NET Core and EF Core is Warning-only.
ApplicationName: Name of your application (used for index naming)ApplicationVersion: Version of your applicationLoggingLevel: Serilog logging levelElasticsearchUrl: ElasticSearch cluster URLElasticsearchUser: ElasticSearch usernameElasticsearchPassword: ElasticSearch passwordElasticsearchEnvironments: Environments where ElasticSearch logging is enabledElasticsearchCertificatePath: Path to SSL certificate (optional)ElasticsearchDeleteIndexAfterDays: Days logs are kept before being deleted (default: 90). Set to0to keep logs forever.
using Microsoft.Extensions.Logging;
public class HomeController : ControllerBase
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Get()
{
_logger.LogInformation("Processing GET request for Home");
try
{
// Your logic here
return Ok();
}
catch (Exception ex)
{
_logger.LogError(ex, "Error processing GET request");
throw;
}
}
}_logger.LogInformation("User {UserId} accessed resource {ResourceId}",
userId, resourceId);
_logger.LogWarning("Failed login attempt for {Username} from {IpAddress}",
username, ipAddress);SW-Logger/
├── SW.Logger.Console/ # Console logging package
│ ├── IAppBuilderExtensions.cs
│ ├── IServiceCollectionExtensions.cs
│ └── LoggerOptions.cs
├── SW.Logger.ElasticSearch/ # ElasticSearch logging package
│ ├── IAppBuilderExtensions.cs
│ ├── IHostBuilderExtensions.cs
│ ├── LoggerOptions.cs
│ └── StringExtensions.cs
└── SW.Logger.SampleWeb/ # Sample web application
├── Program.cs
├── Startup.cs
└── appsettings.json
The ElasticSearch logger uses data streams with the naming pattern: logs-{application-name}-{environment}
On startup, and every 24 hours after, the logger creates an ILM policy named logs-{application-name}-{environment}-retention
and applies it to its data stream. The policy rolls the data stream over monthly (or at 50 GB per shard) and deletes data
ElasticsearchDeleteIndexAfterDays after rollover. Because it's applied to the data stream itself rather than through an
index template, it isn't affected by which index template wins for the stream.
Supports both basic authentication and certificate-based authentication for ElasticSearch clusters.
- Serilog.AspNetCore (8.0.3)
- SimplyWorks.PrimitiveTypes (8.0.0)
- Elastic.Serilog.Sinks (8.18.2)
- NEST (7.17.5)
- Serilog.AspNetCore (8.0.3)
- SimplyWorks.PrimitiveTypes (8.0.0)
- .NET 8.0 or higher
- For ElasticSearch logging: ElasticSearch cluster (7.x or 8.x)
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License - see the LICENSE file for details.
If you encounter any bugs or have feature requests, please submit an issue on GitHub.