Context
The SDK's log_info, log_warn, log_debug, log_error functions write directly to stdout in their own format. This means:
- Customers can't route SDK logs through their existing log stack (Datadog, Splunk, Loki, Elastic) without parsing + re-emitting
- Customers can't change log levels per logger
- Customers can't attach contextual fields (request_id, meeting_uuid) to SDK logs via Python
logging extras
- When
ZM_RTMS_LOG_FORMAT=json is set, the JSON field names (timestamp, level, component, message) don't match conventional Python logging fields (ts, level, name, msg), so log aggregators see them as a separate stream
What to ship
Python: route all SDK logs through Python's logging module on named loggers:
rtms (root)
rtms.webhook
rtms.client
rtms.eventloop
The customer's logging.basicConfig / dictConfig controls format, level, handlers. ZM_RTMS_LOG_FORMAT becomes a convenience that configures a default JsonFormatter on the root rtms logger, but customers who want custom routing do so via standard Python logging mechanisms.
Node.js: accept a logger object via SDK constructor (or rtms.setLogger(loggerInstance)). Compatible with winston, pino, or any logger that has .info/warn/error/debug methods. If no logger provided, default to console.
Acceptance criteria
Cross-language parity
Source
Tracked in vault: Projects/RTMS SDK v1.2.md → DEVS-X12.
Tracker
Part of the v1.2 milestone. Project: https://github.com/orgs/zoom/projects/11.
Context
The SDK's
log_info,log_warn,log_debug,log_errorfunctions write directly to stdout in their own format. This means:loggingextrasZM_RTMS_LOG_FORMAT=jsonis set, the JSON field names (timestamp,level,component,message) don't match conventional Python logging fields (ts,level,name,msg), so log aggregators see them as a separate streamWhat to ship
Python: route all SDK logs through Python's
loggingmodule on named loggers:rtms(root)rtms.webhookrtms.clientrtms.eventloopThe customer's
logging.basicConfig/dictConfigcontrols format, level, handlers.ZM_RTMS_LOG_FORMATbecomes a convenience that configures a defaultJsonFormatteron the rootrtmslogger, but customers who want custom routing do so via standard Python logging mechanisms.Node.js: accept a logger object via SDK constructor (or
rtms.setLogger(loggerInstance)). Compatible withwinston,pino, or any logger that has.info/warn/error/debugmethods. If no logger provided, default toconsole.Acceptance criteria
logging.getLogger("rtms.*")for all log outputZM_RTMS_LOG_FORMAT=jsonconfigures a defaultJsonFormatteron thertmsloggerZM_RTMS_LOG_LEVELsets the rootrtmslogger's leveldictConfigCross-language parity
ZM_RTMS_LOG_FORMAT,ZM_RTMS_LOG_LEVEL)examples/python.mdandexamples/node.mdSource
Tracked in vault:
Projects/RTMS SDK v1.2.md→ DEVS-X12.Tracker
Part of the v1.2 milestone. Project: https://github.com/orgs/zoom/projects/11.