Implementing Logging in Your Application
Add comprehensive logging for debugging and monitoring.
By EMEPublished: February 20, 2025
loggingserilogstructured loggingobservability
A Simple Analogy
Logging is like keeping a detailed diary. Every important event gets recorded for later analysis.
Why Logging?
- Debugging: Track application flow
- Monitoring: Detect issues in production
- Auditing: Record user actions
- Performance: Identify bottlenecks
- Support: Help diagnose customer issues
Setup Serilog
var logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console()
.WriteTo.File("logs/app-.txt",
rollingInterval: RollingInterval.Day)
.Enrich.FromLogContext()
.Enrich.WithProperty("Environment", env)
.CreateLogger();
Log.Logger = logger;
builder.Host.UseSerilog(logger);
Structured Logging
// Bad
logger.LogInformation("User logged in");
// Good
logger.LogInformation("User {UserId} logged in at {LoginTime} from {IpAddress}",
userId, DateTime.UtcNow, ipAddress);
// Output: User 123 logged in at 2025-02-20 10:30:00 from 192.168.1.1
Log Levels
logger.LogDebug("Debug: Detailed information");
logger.LogInformation("Info: General information");
logger.LogWarning("Warning: Potential problem");
logger.LogError("Error: Something failed");
logger.LogCritical("Critical: System failure");
Exception Logging
try
{
await ProcessOrderAsync(order);
}
catch (Exception ex)
{
logger.LogError(ex, "Failed to process order {OrderId}", order.Id);
throw;
}
Best Practices
- Structured: Include context in logs
- Levels: Use appropriate severity
- Performance: Don't log sensitive data
- Context: Add correlation IDs
- Aggregation: Use log aggregation tools
Related Concepts
- Log aggregation (ELK, Splunk)
- Application Insights
- CloudWatch
- Distributed tracing
Summary
Implement structured logging with Serilog. Include context information and use appropriate log levels for effective monitoring.