Isaac.

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

  1. Structured: Include context in logs
  2. Levels: Use appropriate severity
  3. Performance: Don't log sensitive data
  4. Context: Add correlation IDs
  5. 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.