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; }