code: function Logger( configuration, channels = [] ) {
     this.levels = { ...levels, ...configuration.get( 'logging.levels' ) };
  
     this.queueSize_ = 100;
     this.channels_ = channels;
     this.counter_ = 0;
     this.messageQueue_ = [];
     this.threshold_ = 0;
     this.tags_ = {};
  
     this.levelToName_ = ( levels => {
        const result = {};
        forEach( levels, ( level, levelName ) => {
           this[ levelName.toLowerCase() ] = ( ...args ) => {
              this.log( level, ...args, BLACKBOX );
           };
           result[ level ] = levelName;
        } );
        return result;
     } )( this.levels );
  
     this.setLogThreshold( configuration.ensure( 'logging.threshold' ) );
  }
docs: eslint-disable-next-line valid-jsdoc 
  A flexible logger.
  
  It is recommended to prefer this logger over `console.log` and friends, at least for any log messages that
  might make their way into production code. For once, this logger is safe to use across browsers and allows
  to attach additional channels for routing messages to (i.e. to send them to a server process for
  persistence). If a browser console is available, messages will be logged to that console using the builtin
  console channel.
  For testing, a silent mock for this logger is used, making it simple to test the logging behavior of
  widgets and activities, while avoiding noisy log messages in the test runner output.
  
  All messages produced
  
  @constructor
  @private