Awesome-claude-code create-structured-logger

Generates Structured Logger for PHP 8.4. Creates PSR-3 structured logging setup with Monolog processors, correlation ID propagation, and context middleware. Includes unit tests.

install
source · Clone the upstream repo
git clone https://github.com/dykyi-roman/awesome-claude-code
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/dykyi-roman/awesome-claude-code "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/create-structured-logger" ~/.claude/skills/dykyi-roman-awesome-claude-code-create-structured-logger && rm -rf "$T"
manifest: skills/create-structured-logger/SKILL.md
source content

Structured Logger Generator

Creates structured logging infrastructure for observability and request tracing.

When to Use

ScenarioExample
Distributed tracingCorrelate logs across microservices
Request debuggingTrack full request lifecycle
Audit loggingStructured records with context
Error investigationRich context in error logs

Component Characteristics

CorrelationId

  • Value Object wrapping UUIDv4
  • Immutable, self-validating
  • Propagated via
    X-Request-ID
    header

CorrelationIdProcessor

  • Monolog processor adding
    correlation_id
    to every record
  • Reads from CorrelationIdHolder thread-local storage
  • Zero-config: auto-enriches all log entries

RequestContextProcessor

  • Monolog processor adding request metadata
  • Captures method, URI, IP, user-agent
  • Enables filtering logs by request attributes

CorrelationIdMiddleware

  • PSR-15 middleware extracting or generating X-Request-ID
  • Stores in CorrelationIdHolder for downstream use
  • Adds correlation ID to response headers

CorrelationIdHolder

  • Static thread-local storage for correlation ID
  • Set once per request, available globally
  • Reset after request completes

Generation Process

Step 1: Generate Core Components

Path:

src/Infrastructure/Logging/

  1. CorrelationId.php
    — Value Object with UUID validation
  2. CorrelationIdHolder.php
    — Thread-local correlation ID storage

Step 2: Generate Monolog Processors

Path:

src/Infrastructure/Logging/Processor/

  1. CorrelationIdProcessor.php
    — Adds correlation_id to log records
  2. RequestContextProcessor.php
    — Adds request context to log records

Step 3: Generate Middleware

Path:

src/Infrastructure/Logging/

  1. CorrelationIdMiddleware.php
    — PSR-15 middleware for correlation ID

Step 4: Generate Tests

  1. CorrelationIdTest.php
    — Value Object tests
  2. CorrelationIdProcessorTest.php
    — Processor enrichment tests
  3. CorrelationIdMiddlewareTest.php
    — Middleware behavior tests

File Placement

ComponentPath
Core Classes
src/Infrastructure/Logging/
Processors
src/Infrastructure/Logging/Processor/
Unit Tests
tests/Unit/Infrastructure/Logging/

Naming Conventions

ComponentPatternExample
Value Object
CorrelationId
CorrelationId
Holder
CorrelationIdHolder
CorrelationIdHolder
Processor
{Context}Processor
CorrelationIdProcessor
Middleware
CorrelationIdMiddleware
CorrelationIdMiddleware
Test
{ClassName}Test
CorrelationIdTest

Quick Template Reference

CorrelationId

final readonly class CorrelationId
{
    public function __construct(public string $value)
    {
        // Validates UUID v4 format
    }

    public static function generate(): self;
    public function toString(): string;
}

CorrelationIdProcessor

final readonly class CorrelationIdProcessor
{
    public function __invoke(LogRecord $record): LogRecord;
}

CorrelationIdMiddleware

final readonly class CorrelationIdMiddleware implements MiddlewareInterface
{
    public function process(
        ServerRequestInterface $request,
        RequestHandlerInterface $handler
    ): ResponseInterface;
}

Usage Example

// Middleware extracts or generates correlation ID
$middleware = new CorrelationIdMiddleware(headerName: 'X-Request-ID');

// Monolog processor auto-enriches every log entry
$logger->pushProcessor(new CorrelationIdProcessor());
$logger->pushProcessor(new RequestContextProcessor($request));

// Log entry output:
// {"message":"Order created","correlation_id":"550e8400-...","method":"POST","uri":"/orders"}

Log Flow

Request ──→ CorrelationIdMiddleware
                │
         Extract/Generate X-Request-ID
                │
         Store in CorrelationIdHolder
                │
         CorrelationIdProcessor ──→ Adds correlation_id to every log
         RequestContextProcessor ──→ Adds method, URI, IP to every log
                │
         Response ──→ Add X-Request-ID header

Anti-patterns to Avoid

Anti-patternProblemSolution
Manual correlation IDsInconsistent, easy to forgetAuto-enrich via processor
Unstructured logsCannot query or filterUse structured JSON format
No request contextCannot trace request flowAdd request processor
Global mutable loggerThread safety issuesUse holder with request scope
Missing response headerClient cannot correlateReturn X-Request-ID in response
No holder cleanupMemory leak between requestsReset holder after request

References

For complete PHP templates and examples, see:

  • references/templates.md
    — CorrelationId, Processors, Middleware, Holder templates
  • references/examples.md
    — Service integration examples and tests