Configures structured JSON logging with Serilog (.NET) or structlog (Python). Use when adding logging to backend projects.
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-10don't have the plugin yet? install it then click "run inline in claude" again.