title: Serilog event rate limit with notification about limiting actually happened
body: <p>I throttle events for all sinks registered in a Serilog logger: only 5 events per minute are allowed to be emitted by any sink.</p>
  <p>I need a record (a Serilog event) in all the sinks that the throttling actually took place, otherwise I don't know if the exact max. allowed amount of events has been logged per minute or more events have been throttled.</p>
  <p>I use my own throttle approach similar to the <a href="https://gist.github.com/nblumhardt/d3baa1ea511242951e78" rel="nofollow noreferrer">&quot;official&quot; PoC</a>. I create an <code>ILogEventFilter</code>, and in its <code>IsEnabled</code> method I check the current rate of the events and want to write my &quot;throttling happened&quot; event to all the sinks directly (otherwise, e.g. if I write this event via the logger, I'm in endless recursion):</p>
  <pre class="lang-cs prettyprint-override"><code>public class EventFilter : ILogEventFilter
  {
      public bool IsEnabled(LogEvent logEvent)
      {
          var enabled = ThrottledInvoker&lt;string&gt;.Invoke( // internally counts the calls, the method signature is simplified for the sake of this code sample
                              () =&gt; // method to call if throttling takes place
                              {
                                  // send additional events/records into the sinks about throttling
                                  
                                  var throttlingInfoEvent = new LogEvent(
                                      logEvent.Timestamp,
                                      logEvent.Level,
                                      null,
                                      MessageTemplate.Empty,
                                      new[] {
                                          new LogEventProperty(&quot;CustomMessage&quot;, new ScalarValue(&quot;Too many events of this kind.&quot;)),
                                      });
                                  
                                  // TODO: how to write to registered sinks?
                                  sink1.Emit(throttlingInfoEvent);
                                  sink2.Emit(throttlingInfoEvent);
                                  // ...
                                  // sinkN.Emit(throttlingInfoEvent);
                              },
                              TimeSpan.FromMinutes(1), // time period
                              5); // max. allowed event count per time period
          return enabled;
      }
  }
  </code></pre>
  <p>I have found no <code>Logger.Sinks</code> property or anything alike. I understand that I can use reflection (<a href="https://github.com/serilog/serilog/issues/1284" rel="nofollow noreferrer">issue on GitHub</a>) to get private <code>_sinks</code> fields of my logger's aggregated sinks, but that smells.</p>
  <p>I could initialize my filter before passing it to <code>LoggerConfiguration.Filter.With()</code> method, and pass all the sinks as my filter's constructor arguments. But the logger and sinks are configured by another component of the application which I don't have access to.</p>
  <p>Is there a right/official way to do what I want?</p>