public void Log(ILogItem item)
        {
            try
            {
                if (!isInitialized)
                {
                    Initialize();
                }

                if (LoggingMode.Trim().ToUpperInvariant() == LogMode.Asynchronous.ToString().Trim().ToUpperInvariant())
                {
                    AddToQueue(item);
                }
                else
                {
                    foreach (KeyValuePair <int, ILogger> keyValuePair in TargetLoggers)
                    {
                        try
                        {
                            keyValuePair.Value.Log(item);
                            break; // If no exception stop targetting the remaining loggers
                        }
                        catch (Exception)
                        {
                            continue; // If exception occured in the higher priority logger, process next logger
                        }
                    }
                }
            }
            catch (Exception)
            {
                // The exception throw is suppressed so that applications dont get runtime errors
                // if logging fails for any reason
            }
        }
        /// <summary>
        /// Initializes target loggers in mode determined by configuration
        /// </summary>
        internal void Initialize()
        {
            logItemsQueue = new ConcurrentQueue <ApplicationLogs>();
            targetLoggers = new Dictionary <int, ILogger>();

            // LogController Level settings
            LoggingConfigurationSetting loggingSetting = CurrentLoggingConfiguration.LoggingConfigurationSetting;

            if (loggingSetting != null)
            {
                this.LoggingMode   = loggingSetting.Mode;
                this.SleepInterval = loggingSetting.SleepInterval;
                this.MaxQueueSize  = loggingSetting.MaxQueueSize;
            }

            // Logger Level settings
            LoggerSettings = CurrentLoggersConfiguration.LoggerConfigurationSettings.Cast <LoggerConfigurationSetting>().ToList();

            try
            {
                // Setup Target loggers from configuration ordered by PriorityOrder
                foreach (LoggerConfigurationSetting configuredLogger in LoggerSettings.OrderBy(o => Convert.ToInt32(o.PriorityOrder)))
                {
                    loggerSequence++;
                    //loggerInstance = dependencyManager.Resolve<ILogger>(configuredLogger.TypeName);
                    loggerInstance.LoggerParameters = configuredLogger.Parameters;
                    loggerInstance.LoggerPriority   = Convert.ToInt32(configuredLogger.PriorityOrder);
                    targetLoggers.Add(loggerSequence, loggerInstance);
                }
            }
            catch (Exception)
            {
                // Do Nothing if logger setup fails
            }

            // If using Asynchronous processing, use another thread for Async Queue processing
            if (LoggingMode.Trim().ToUpperInvariant() == LogMode.Asynchronous.ToString().Trim().ToUpperInvariant())
            {
                processQueueTask = Task.Factory.StartNew(() =>
                {
                    while (true)
                    {
                        ProcessFromQueue();
                        Thread.Sleep(SleepInterval);
                    }
                }, new CancellationToken(), TaskCreationOptions.LongRunning, TaskScheduler.Default);
            }
            isInitialized = true;
        }