public static final SyslogServerIF createInstance(final String protocol, final SyslogServerConfigIF config) throws SyslogRuntimeException {
		if (protocol == null || "".equals(protocol.trim())) {
			throw new SyslogRuntimeException("Instance protocol cannot be null or empty");
		}

		if (config == null) {
			throw new SyslogRuntimeException("SyslogServerConfig cannot be null");
		}

		final String syslogProtocol = protocol.toLowerCase();
		SyslogServerIF syslogServer = null;

		synchronized(instances) {
			if (instances.containsKey(syslogProtocol)) {
				throw new SyslogRuntimeException("SyslogServer instance \"" + syslogProtocol + "\" already defined.");
			}

			try {
				final Class<? extends SyslogServerIF> syslogClass = config.getSyslogServerClass();
				syslogServer = syslogClass.newInstance();
			} catch (final Exception e) {
				throw new SyslogRuntimeException(e);
			}

			syslogServer.initialize(syslogProtocol,config);

			instances.put(syslogProtocol,syslogServer);
		}

		return syslogServer;
	}