Skip to main content
Supply a logger and the SDK routes its output to it. Without one, output is discarded.

The interface

You may implement any subset; missing levels are filled in with no-ops. Values travel in fields, never interpolated into message. A message that embeds its values produces a unique string per occurrence, which cannot be grouped, counted or alerted on. A stable message plus structured fields can. An error is carried as fields.cause.

A console logger

What the SDK logs

Records carry fields such as status, attempt, retry_in_ms, configs, flags, key_type, event, consecutive_failures and cause.

Secrets never reach the logger

No log record contains a secret’s value or a secret’s key name, at any level, and no record contains the API key. A test in the SDK drives a sync carrying a secret through a capturing logger at the most verbose level and fails if either appears anywhere in the output. A configuration rejection naming the API key carries only its prefix - wxp_...
  • never the material.

A logger that throws cannot break the SDK

Every call is guarded. A logger is diagnostic equipment; a broken one does not take the sync loop down with it.