| Application Call Site | Owns client protocol, request identity, retry, and resume behavior. In this design it participates in: Check level before allocating expensive event fields. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Logger Facade. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Network appender recursively logs failure” to the external caller. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Application Call Site boundary before extracting or scaling it. |
| Logger Facade | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Build immutable structured event and redact known sensitive keys at the boundary. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Application Call Site from also owning the contract and failure behavior of Level Filter. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Buffer fills during outage” to Application Call Site. | Costs eventual consistency, schema evolution, replay tooling, idempotent consumers, and lag operations. Earn it when bursts or downstream failure must not block acknowledgment. Measure the latency, saturation, lag, or mismatch at the Logger Facade boundary before extracting or scaling it. |
| Level Filter | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Offer to bounded ring buffer under explicit block/drop/sample policy by severity. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Logger Facade from also owning the contract and failure behavior of Context / MDC. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Mutable context leaks across requests” to Logger Facade. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Level Filter boundary before extracting or scaling it. |
| Context / MDC | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Dispatcher batches, formats once per appender needs, and isolates sink failures. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Level Filter from also owning the contract and failure behavior of Event Builder. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Rotation loses file handle” to Level Filter. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Context / MDC boundary before extracting or scaling it. |
| Event Builder | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Rotation atomically renames/reopens; shutdown flushes until deadline then records drops. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Context / MDC from also owning the contract and failure behavior of Redaction Filter. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Shutdown deadlocks application thread” to Context / MDC. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Event Builder boundary before extracting or scaling it. |
| Redaction Filter | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Check level before allocating expensive event fields. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Event Builder from also owning the contract and failure behavior of Bounded Ring Buffer. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Network appender recursively logs failure” to Event Builder. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Redaction Filter boundary before extracting or scaling it. |
| Bounded Ring Buffer | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Build immutable structured event and redact known sensitive keys at the boundary. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Redaction Filter from also owning the contract and failure behavior of Async Dispatcher. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Buffer fills during outage” to Redaction Filter. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Bounded Ring Buffer boundary before extracting or scaling it. |
| Async Dispatcher | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Offer to bounded ring buffer under explicit block/drop/sample policy by severity. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Bounded Ring Buffer from also owning the contract and failure behavior of Formatter. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Mutable context leaks across requests” to Bounded Ring Buffer. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Async Dispatcher boundary before extracting or scaling it. |
| Formatter | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Dispatcher batches, formats once per appender needs, and isolates sink failures. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Async Dispatcher from also owning the contract and failure behavior of Console Appender. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Rotation loses file handle” to Async Dispatcher. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Formatter boundary before extracting or scaling it. |
| Console Appender | Owns client protocol, request identity, retry, and resume behavior. In this design it participates in: Rotation atomically renames/reopens; shutdown flushes until deadline then records drops. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Formatter from also owning the contract and failure behavior of File Appender. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Shutdown deadlocks application thread” to Formatter. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Console Appender boundary before extracting or scaling it. |
| File Appender | Owns client protocol, request identity, retry, and resume behavior. In this design it participates in: Check level before allocating expensive event fields. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Console Appender from also owning the contract and failure behavior of Network Appender. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Network appender recursively logs failure” to Console Appender. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the File Appender boundary before extracting or scaling it. |
| Network Appender | Owns client protocol, request identity, retry, and resume behavior. In this design it participates in: Build immutable structured event and redact known sensitive keys at the boundary. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents File Appender from also owning the contract and failure behavior of Rotation Manager. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Buffer fills during outage” to File Appender. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Network Appender boundary before extracting or scaling it. |
| Rotation Manager | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Offer to bounded ring buffer under explicit block/drop/sample policy by severity. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Network Appender from also owning the contract and failure behavior of Failure Fallback. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Mutable context leaks across requests” to Network Appender. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Rotation Manager boundary before extracting or scaling it. |
| Failure Fallback | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Dispatcher batches, formats once per appender needs, and isolates sink failures. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Rotation Manager from also owning the contract and failure behavior of Metrics. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Rotation loses file handle” to Rotation Manager. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Failure Fallback boundary before extracting or scaling it. |
| Metrics | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Rotation atomically renames/reopens; shutdown flushes until deadline then records drops. | Proves correctness and supports controlled recovery. It prevents Failure Fallback from also owning the contract and failure behavior of operators and repair tooling. | Infer correctness from request logs. Logs do not prove durable business state, detect silent drift, or safely repair ambiguous outcomes. Here that simpler choice would couple “Shutdown deadlocks application thread” to Failure Fallback. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Metrics boundary before extracting or scaling it. |