ln-771-logging-configurator
Type: L3 Worker Category: 7XX Project Bootstrap
Configures structured JSON logging for .NET and Python projects.
Overview
Aspect Details
Input Context Store from ln-770
Output Logging configuration files
Stacks .NET (Serilog), Python (structlog)
Phase 1: Receive Context
Accept Context Store from coordinator.
Required Context:
-
STACK : .NET or Python
-
FRAMEWORK : ASP.NET Core or FastAPI
-
FRAMEWORK_VERSION : Version number
-
PROJECT_ROOT : Project directory path
-
ENVIRONMENT : Development or Production
Validation:
-
If STACK not provided, detect from project files
-
If version not provided, use latest stable
Phase 2: Research Current Best Practices
Use MCP tools to get up-to-date documentation.
For .NET (Serilog):
MCP ref: "Serilog ASP.NET Core structured logging configuration" Context7: /serilog/serilog-aspnetcore
For Python (structlog):
MCP ref: "structlog Python structured logging configuration" Context7: /hynek/structlog
Key Patterns to Research:
-
Request logging middleware
-
Log enrichment (correlation ID, user context)
-
Log level configuration by environment
-
Sink configuration (Console, File, Seq, Elastic)
Phase 3: Decision Points
Ask user for configuration preferences.
Q1: Log Format
Option When to Use
JSON (Recommended for Production) Machine-readable, log aggregation systems
Pretty/Colored (Recommended for Development) Human-readable, local debugging
Q2: Enrichment Fields
Field Description Default
correlationId
Request tracking across services ✓ Yes
userId
Authenticated user identifier ✓ Yes
requestPath
HTTP request path ✓ Yes
responseTime
Request duration in ms ✓ Yes
machineName
Server hostname Optional
threadId
Thread identifier Optional
Q3: Log Sinks
Sink Use Case
Console Always enabled
File Local persistence, log rotation
Seq Structured log server
Elasticsearch Log aggregation at scale
Q4: Log Levels by Environment
Level Development Production
Default Debug Information
Microsoft.* Information Warning
System.* Information Warning
Application Debug Information
Phase 4: Generate Configuration
Generate files based on stack and decisions.
.NET Output Files
File Purpose
Extensions/LoggingExtensions.cs
Service registration
appsettings.json (update) Serilog configuration
appsettings.Development.json (update) Dev overrides
Generation Process:
-
Use MCP ref to get current Serilog API
-
Generate LoggingExtensions.cs with:
-
UseSerilog configuration
-
Request logging middleware
-
Enrichment configuration
-
Update appsettings.json with Serilog section
Packages to Add:
-
Serilog.AspNetCore
-
Serilog.Sinks.Console
-
Serilog.Sinks.File (if File sink selected)
-
Serilog.Enrichers.Environment (if machineName selected)
Python Output Files
File Purpose
core/logging_config.py
structlog configuration
middleware/logging_middleware.py
Request logging
Generation Process:
-
Use MCP ref to get current structlog API
-
Generate logging_config.py with:
-
Processor chain configuration
-
Renderer selection (JSON/Console)
-
Log level configuration
-
Generate logging_middleware.py for FastAPI
Packages to Add:
-
structlog
-
python-json-logger (if JSON format)
Phase 5: Validate
Verify the configuration works.
Validation Steps:
Check imports: Ensure all packages are available
-
.NET: dotnet list package | grep Serilog
-
Python: pip list | grep structlog
Syntax check:
-
.NET: dotnet build --no-restore
-
Python: python -m py_compile core/logging_config.py
Test log output:
-
Start application
-
Make test request
-
Verify log format matches configuration
Expected Log Format:
{ "timestamp": "2026-01-10T12:00:00.000Z", "level": "info", "message": "Request completed", "correlationId": "abc-123", "requestPath": "/api/health", "responseTime": 45, "statusCode": 200 }
Return to Coordinator
Return result to ln-770:
{ "status": "success", "files_created": [ "Extensions/LoggingExtensions.cs", "appsettings.json" ], "packages_added": [ "Serilog.AspNetCore", "Serilog.Sinks.Console" ], "registration_code": "services.AddLoggingServices(configuration);", "message": "Configured structured logging with Serilog" }
Idempotency
This skill is idempotent:
-
Phase 1: Check if logging already configured (Grep for Serilog/structlog)
-
If configured: Return { "status": "skipped", "message": "Logging already configured" }
-
If not: Proceed with configuration
Reference Links
-
Serilog.AspNetCore
-
structlog Documentation
-
ASP.NET Core Logging
Critical Rules
-
Use MCP ref/Context7 for current API — do not hardcode Serilog/structlog config from memory
-
Idempotent — if Serilog or structlog already configured, return status: "skipped" immediately
-
Environment-aware log levels — Debug for Development, Information for Production (never Warning default)
-
Always include correlation ID enrichment — required for distributed tracing
-
Return structured response — files_created , packages_added , registration_code for coordinator aggregation
Definition of Done
-
Context Store received and validated (stack, framework, version)
-
Best practices researched via MCP tools for target stack
-
User decisions collected (format, enrichment, sinks, log levels)
-
Configuration files generated (extensions/config + appsettings or Python modules)
-
Syntax validated (dotnet build or py_compile )
-
Structured JSON response returned to ln-770 coordinator
Version: 2.0.0 Last Updated: 2026-01-10