📝 clarify async context field replacement

This commit is contained in:
Nanaloveyuki
2026-06-14 10:48:37 +08:00
parent 33fc929dc6
commit 6d1261f02b
@@ -40,6 +40,7 @@ Detailed rules explaining key parameters and behaviors
- Context fields are merged during `log(...)` before enqueue.
- When a log call also passes per-record fields, the context fields are placed before those per-call fields.
- This API returns a new logger value; it does not mutate the original async logger.
- The provided `fields` array replaces the previously stored shared field set on the returned async logger; it does not append onto whatever `context_fields` the source logger already had.
- Unlike synchronous `Logger::with_context_fields(...)`, this async variant stores fields directly on `AsyncLogger` instead of changing the visible sink type.
- In the current direct async coverage, the original logger keeps its previous `context_fields`, while the derived logger prepends the stored shared fields ahead of per-call fields exactly once when records are built.
@@ -76,6 +77,8 @@ In this example, target composition and field binding stay separate but work tog
e.g.:
- If `fields` is empty, the logger remains valid and just adds no extra metadata.
- If a derived async logger already had shared context fields, calling `with_context_fields(...)` again replaces that stored shared field set on the new derived logger rather than stacking both sets together.
- If duplicate field keys are provided, all fields are still emitted; conflict handling is left to the consumer side.
### Notes
@@ -85,3 +88,5 @@ e.g.:
2. This async variant preserves the visible `AsyncLogger[S]` type while still injecting shared fields.
3. Use a fresh derived logger when one code path needs shared metadata and another should stay unchanged.
4. If you need to combine two shared field sets, combine them in the `fields` argument yourself instead of expecting repeated `with_context_fields(...)` calls to accumulate them.