Serilog in .NET Core Web API
📝 Serilog in .NET Core Web API
Serilog is a structured logging library that enables flexible, readable logging for .NET apps. It supports multiple sinks such as console, file, and SQL Server, making it ideal for debugging and monitoring.
🔧 Step 1: Install NuGet Packages
Install the following packages:
Install-Package Serilog.AspNetCore
Install-Package Serilog.Settings.Configuration
Install-Package Serilog.Sinks.Console
Install-Package Serilog.Sinks.File
🛠️ Step 2: Configure Serilog in Program.cs
using Serilog;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
var builder = WebApplication.CreateBuilder(args);
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(builder.Configuration)
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
builder.Host.UseSerilog();
builder.Services.AddControllers();
var app = builder.Build();
app.UseSerilogRequestLogging();
app.MapControllers();
app.Run();
⚙️ Step 3: Configure appsettings.json
{
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": "Information",
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": {
"path": "logs/log-.txt",
"rollingInterval": "Day"
}
}
],
"Enrich": [ "FromLogContext" ],
"Properties": {
"Application": "MyAPI"
}
}
}
💻 Using Serilog in a Controller
[ApiController]
[Route("api/[controller]")]
public class SampleController : ControllerBase
{
private readonly ILogger<SampleController> _logger;
public SampleController(ILogger<SampleController> logger)
{
_logger = logger;
}
[HttpGet]
public IActionResult Get()
{
_logger.LogInformation("Handling GET at {Time}", DateTime.UtcNow);
return Ok("Logging with Serilog!");
}
}
✅ Real-Time Example: Logging User Login
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private readonly ILogger<AuthController> _logger;
public AuthController(ILogger<AuthController> logger)
{
_logger = logger;
}
[HttpPost("login")]
public IActionResult Login([FromBody] LoginRequest request)
{
_logger.LogInformation("Login attempt for user: {Username} at {Time}", request.Username, DateTime.UtcNow);
if (request.Username == "admin" && request.Password == "password")
{
_logger.LogInformation("✅ Successful login for user: {Username} at {Time}", request.Username, DateTime.UtcNow);
return Ok("Login successful");
}
_logger.LogWarning("❌ Failed login for user: {Username} at {Time}", request.Username, DateTime.UtcNow);
return Unauthorized("Invalid credentials");
}
}
public class LoginRequest
{
public string Username { get; set; }
public string Password { get; set; }
}
💡 Tip: You’ll see entries like:
[Information] Login attempt for user: admin at 2024-03-18T12:00:00Z[Warning] Failed login for user: hacker at 2024-03-18T12:05:00Z
🔄 Advanced Features
1️⃣ Logging to SQL Server
Install:
Install-Package Serilog.Sinks.MSSqlServer
Configure in Program.cs:
.WriteTo.MSSqlServer(
connectionString: "YourConnectionString",
sinkOptions: new MSSqlServerSinkOptions { TableName = "Logs" })
2️⃣ Enrich Logs with Context
Log.Logger = new LoggerConfiguration()
.Enrich.WithProperty("Environment", "Production")
.Enrich.WithThreadId()
.CreateLogger();
3️⃣ Enable HTTP Request Logging
app.UseSerilogRequestLogging();
This logs each HTTP request with details like status code, duration, etc.
📌 Conclusion
Serilog makes structured logging easy, extensible, and production-ready. By integrating it with ASP.NET Core Web API, you gain powerful diagnostics, traceability, and support for rich logging outputs like files, databases, or the cloud.
Use it early in development to catch issues faster and keep your logs clean and informative.
Comments
Post a Comment