code: func (logger *Logger) UpdateOutput(uri string, classes ...LogClass) error {
  
  	u, err := url.Parse(uri)
  	if err != nil {
  		return err
  	}
  
  	class := NONE
  	for _, c := range classes {
  		class |= c
  	}
  
  	newoutputs := make([]*loggerOutputWrapper, 0)
  	// Lock our outputs
  	logger.outputMutex.Lock()
  	defer logger.outputMutex.Unlock()
  	for i, o := range logger.outputs {
  		if (o.Class == class || o.Class&class != 0) && u.Scheme == o.OutputWrapper.URL.Scheme {
  			// Found a match
  
  			// generate it with new uri for intersection of given classes and output's classes.
  			lo, err := createOutputWrapperForClass(uri, o.Class&class)
  			if err != nil {
  				return err
  			}
  			if lo == nil {
  				continue
  			}
  
  			logger.outputs[i] = lo
  
  			// Save this output for rest of the classes not being updated.
  			// Add these later outside the loop so that these are not updated.
  			restClasses := (o.Class ^ class) & o.Class
  			if restClasses != NONE && restClasses != isPLUSDEF {
  				o.Class = restClasses
  				newoutputs = append(newoutputs, o)
  			}
  		}
  	}
  
  	logger.outputs = append(logger.outputs, newoutputs...)
  
  	return nil
  }
docs: // UpdateOutput updates an existing output matching for an URI scheme
  // and exact classes match. For ex. if classes passed here are, DEBUG
  // and ERROR, it will update Outputs with Class equals to DEBUG|ERROR.