/// <summary> /// Initializes target loggers in mode determined by configuration /// </summary> internal void Initialize() { // 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.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; }
/// <summary> /// Processes LogItems asyncronously from the queue /// </summary> internal void ProcessFromQueue() { ILogItem logItem = null; while (LogItems.TryDequeue(out logItem)) { if (logItem != null) { // Target loggers are already ordered by PriorityOrder foreach (KeyValuePair <int, ILogger> keyValuePair in TargetLoggers.OrderBy(o => o.Key)) { try { keyValuePair.Value.Log(logItem); break; // If no exception stop targetting the remaining loggers } catch (Exception) { continue; // If exception occured in the higher priority logger, process next logger } } } } }