예제 #1
0
        /// <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;
        }
예제 #2
0
        /// <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
                        }
                    }
                }
            }
        }