MillerByte.Logging.Api

Configuration Options

Last updated: 1/28/2026

MillerByte.Logging.Api provides extensive configuration options to customize logging behavior, performance, and security settings.

MongoDB Connection

builder.Services.AddApiLogging(builder.Configuration, options =>
{
    options.ConnectionString = "mongodb://localhost:27017";
    options.DatabaseName = "ApiLogs";
    options.SessionsCollectionName = "LoginSessions";
    options.ActionsCollectionName = "ApiActions";
});

Multi-Database Support (v1.2.0+)

Route specific endpoints to different databases or collections for multi-tenant scenarios, compliance requirements, or different retention policies.

Write Routing

Use the ApiLogging attribute to route writes to different databases:

// Route to tenant-specific database
[ApiLogging(DatabaseName = "logs-tenant-premium")]
public class PremiumController : ControllerBase { }

// Route to audit database for critical operations
[HttpPost("payment")]
[ApiLogging(DatabaseName = "audit-logs", CollectionName = "payment-actions")]
public IActionResult ProcessPayment() => Ok();

Read Queries

Query from different databases using IApiLoggingQueryService:

// Query from default database
var defaultSessions = await _queryService.GetSessionsAsync(parameters);

// Query from tenant-specific database
var premiumSessions = await _queryService.GetSessionsAsync(
    parameters,
    databaseName: "logs-tenant-premium",
    collectionName: "sessions");

// Query from audit database
var auditActions = await _queryService.GetActionsAsync(
    parameters,
    databaseName: "audit-logs",
    collectionName: "payment-actions");

Automatic Routing

The background service automatically groups and routes actions to the correct database and collection. No additional configuration needed - just specify the database/collection names in the attribute or query parameters.

Common Use Cases

  • Multi-Tenancy: Separate databases per tenant for data isolation and independent scaling
  • Compliance: Store PCI/HIPAA data in separate, secured databases with different access controls
  • Audit Logs: Critical operations in immutable audit databases with long retention
  • Performance Tiers: Premium customers get dedicated infrastructure with better performance
  • Retention Policies: Different databases with different backup schedules and retention rules
  • Geographic Distribution: Route logs to region-specific databases for compliance

Background Processing

Control how logs are batched and processed:

options.BatchSize = 100;              // Logs per batch
options.BatchIntervalMs = 500;        // Batch interval in ms
options.ChannelCapacity = 10000;      // Max queued logs
options.UseBackgroundQueue = true;    // Enable async processing

Session Strategy

Configure how user sessions are identified and tracked:

options.SessionStrategy = SessionStrategy.Hybrid;
options.SessionInactivityTimeoutMinutes = 30;
options.SessionCleanupIntervalMinutes = 60;
options.SessionLookupCacheEnabled = true;
options.SessionLookupCacheMinutes = 2;

// User identification claim types
options.UserIdClaimTypes = new List<string>
{
    ClaimTypes.NameIdentifier,
    "sub",
    "user_id"
};

// Allow anonymous sessions (optional)
options.AllowAnonymousSessions = false;
options.AnonymousUserIdPrefix = "anonymous-";

Data Capture

Control what data gets logged:

options.LogRequestBody = true;
options.LogResponseBody = true;
options.LogHeaders = true;
options.IncludeGetRequestLogs = false;   // Skip GET requests
options.MaxBodySizeBytes = 1048576;       // 1MB max body size
options.CaptureExceptions = true;
options.CaptureUserClaims = true;
options.EnableResponseCapture = true;

Security & Sanitization

Configure sensitive data filtering:

options.EnableDataSanitization = true;
options.SanitizeStackTracesInProduction = true;
options.SensitiveFieldNames = new List<string>
{
    "password", "token", "authorization", 
    "apiKey", "api_key", "secret",
    "creditCard", "credit_card", "ssn", 
    "pin", "cvv", "bearer"
};

Performance & Scaling

Optimize for high-traffic scenarios:

// Sample only 10% of requests
options.SamplingRate = 0.1;

// Always log errors regardless of sampling
options.AlwaysLogErrors = true;

// Rate limit per session
options.MaxActionsPerSessionPerMinute = 1000;

OpenTelemetry Integration

options.EnableOpenTelemetry = true;
options.EnrichSpansWithPayload = false;
options.ActivitySourceName = "MillerByte.Logging.Api";

Resilience Settings

Configure retry and circuit breaker behavior:

options.RetryAttempts = 3;
options.CircuitBreakerFailureThreshold = 5;
options.CircuitBreakerDurationSeconds = 60;

// Fallback to file logging when MongoDB is unavailable
options.EnableFallbackLogging = true;
options.FallbackLogPath = "./logs/api-logging-fallback";

MongoDB Advanced Settings

Fine-tune MongoDB connection behavior:

// Transaction support (requires replica set)
options.UseTransactions = false;

// Read preference for queries
options.ReadPreference = ReadPreference.Primary;
// Options: Primary, Secondary, SecondaryPreferred, PrimaryPreferred, Nearest

// Write concern for durability
options.WriteConcern = WriteConcern.W1;
// Options: W1, WMajority, Acknowledged, Unacknowledged

Multi-tenancy & Environment

options.TenantIdClaimType = "tenantId";
options.EnvironmentName = "Production";
options.ApiVersion = "v1.0";

Feature Flags

Enable or disable optional features:

builder.Services.AddApiLogging(
    builder.Configuration,
    configureOptions: null,
    configureFeatures: features =>
    {
        features.EnableMetrics = true;
        features.EnableHealthChecks = true;
        features.EnableOpenTelemetry = true;
    });

Full Example

builder.Services.AddApiLogging(builder.Configuration, options =>
{
    // Performance
    options.SamplingRate = 0.5;  // Log 50% of requests
    options.BatchSize = 200;
    
    // Security
    options.EnableDataSanitization = true;
    options.SensitiveFieldNames.Add("myCustomSecret");
    
    // Session
    options.SessionInactivityTimeoutMinutes = 60;
    options.AllowAnonymousSessions = true;
    
    // Data capture
    options.LogResponseBody = true;
    options.MaxBodySizeBytes = 2097152;  // 2MB
    
    // Resilience
    options.EnableFallbackLogging = true;
    options.RetryAttempts = 5;
});