public static final SyslogIF createInstance(final String protocol, final SyslogConfigIF 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("SyslogConfig cannot be null");
		}

		final String syslogProtocol = protocol.toLowerCase();

		SyslogIF syslog = null;

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

			try {
				syslog = config.getSyslogClass().newInstance();
			} catch (final Exception e) {
				if (!config.isThrowExceptionOnInitialize()) {
					throw new SyslogRuntimeException(e);
				} else {
					return null;
				}
			}

			syslog.initialize(syslogProtocol,config);

			instances.put(syslogProtocol,syslog);
		}

		return syslog;
	}