Type: L3 Worker Category: 7XX Project Bootstrap Parent: ln-770-crosscutting-setup
Configures structured JSON logging for .NET and Python projects.
Overview
| 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
STACKnot 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
| JSON (Recommended for Production) | Machine-readable, log aggregation systems
| Pretty/Colored (Recommended for Development) | Human-readable, local debugging
Q2: Enrichment Fields
| 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
| Console | Always enabled
| File | Local persistence, log rotation
| Seq | Structured log server
| Elasticsearch | Log aggregation at scale
Q4: Log Levels by Environment
| 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
| 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
| 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
Version: 2.0.0 Last Updated: 2026-01-10