/**
   * Obtains a Logger from the Context.
   *
   * @param name The name of the Logger to return.
   * @param messageFactory The message factory is used only when creating a logger, subsequent use
   *     does not change the logger but will log a warning if mismatched.
   * @return The Logger.
   */
  @Override
  public Logger getLogger(final String name, final MessageFactory messageFactory) {
    // Note: This is the only method where we add entries to the 'loggers' ivar.
    // The loggers map key is the logger name plus the messageFactory FQCN.
    String key = LoggerContextKey.create(name, messageFactory);
    Logger logger = loggers.get(key);
    if (logger != null) {
      AbstractLogger.checkMessageFactory(logger, messageFactory);
      return logger;
    }

    logger = newInstance(this, name, messageFactory);
    // If messageFactory was null then we need to pull it out of the logger now
    key = LoggerContextKey.create(name, logger.getMessageFactory());
    final Logger prev = loggers.putIfAbsent(key, logger);
    return prev == null ? logger : prev;
  }
 /**
  * Causes all Logger to be updated against the specified Configuration.
  *
  * @param config The Configuration.
  */
 public void updateLoggers(final Configuration config) {
   for (final Logger logger : loggers.values()) {
     logger.updateConfiguration(config);
   }
 }