Check the supported surface
| Surface | Status | Contract |
|---|---|---|
| Named loggers and propagation | Supported | Dotted names, levels, get_logger/getLogger |
| Inline extra, exc_info, stack_info | Supported | Validated fields; exception() lacks extra |
| Existing logging.Handler | Adapter | StdlibHandlerAdapter, separate managers |
| basicConfig | Restricted | Five fields; no format/datefmt |
| dictConfig / fileConfig | Restricted | No incremental updates or handler formatter attachment |
| Lazy message arguments | Unsupported | Pass a complete message string |
| LoggerAdapter, caller introspection | Unsupported | Do not assume full LogRecord parity |
| Journald / OpenTelemetry exporters | Planned | No exporter capability claim |
Separate platform and build features
Package metadata requires Python 3.12+. Source verification on this site uses CPython 3.13 and Linux; that is evidence for the examples, not a complete wheel availability matrix. Rust is required for a source build.
Unix sockets require POSIX. TLS sockets use TCP. Rust log-compat and tracing-compat are optional Cargo features with process-global registration constraints. Consult the bridge reference before mixing native logging frameworks.
Migrate one boundary at a time
Keep the managers separate. Start with one component, make output ownership explicit, and check flush and failure behaviour under load. Use the migration guide and adapter example.