Expand description
Implementation notes
We build our logging in a few layers.
At the lowest level, there is a [Loggable] trait, for events which can
accumulate and eventually be flushed; this combines with the
RateLim structure, which is responsible for managing
the decision of when to flush these [Loggable]s.
The role of RateLim is to decide
when to flush the information in a Loggable,
and to flush the Loggable as needed.
The role of a Loggable is to
accumulate information
and to know how to flush that information as a log message
when it is told to do so.
One layer up, there is LogState, which is used to to
implement Loggable as used by log_ratelim!.
It can remember the name of an activity, accumulate
successes and failures, and remember an error and associated message.
The highest layer is the log_ratelim! macro, which uses
RateLim and LogState to record
successes and failures, and launch background tasks as needed.