objectif
Injecter des champs contextuels sans dupliquer le formatage.
code minimal
import logging, io
buf = io.StringIO()
h = logging.StreamHandler(buf)
fmt = logging.Formatter("%(levelname)s %(message)s [user=%(user)s]")
log = logging.getLogger("app"); log.setLevel(logging.INFO); log.handlers[:] = [h]
adapter = logging.LoggerAdapter(log, extra={"user":"alice"})
adapter.info("ok")
out = buf.getvalue()
print("user=alice" in out) # attendu: True
utilisation
import logging
base = logging.getLogger("svc")
ctx = logging.LoggerAdapter(base, {"request_id":"abc"})
ctx.warning("oops")
print(hasattr(ctx, "info"))
variante(s) utile(s)
import logging
print(isinstance(logging.LoggerAdapter(logging.getLogger(), {}), logging.LoggerAdapter))
notes
- LoggerAdapter ajoute/merge extra à chaque appel.
- Centralisez le formatage au niveau du handler/formatter.