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
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
Version: 2.0.0
Last Updated: 2026-01-10