Exemplo n.º 1
0
        private void Flush()
        {
            LogMessage[] temp;

            lock (_syncRoot)
            {
                if (_isFlusing)
                {
                    return;
                }

                temp = _pendingMessages.CopyAndClear();

                if (temp.Length == 0)
                {
                    return;
                }

                _isFlusing = true;
            }

            _logMsgStat.Remove(temp);

            try
            {
                var messages = new List <LogMessage>();

                DisposeLogMessage disposeMessage = null;
                ILogSource        prevSource     = null;
                var level = default(LogLevels);

                foreach (var message in temp)
                {
                    if (prevSource == null || prevSource != message.Source)
                    {
                        prevSource = message.Source;
                        level      = prevSource.GetLogLevel();
                    }

                    if (level == LogLevels.Inherit)
                    {
                        level = Application.LogLevel;
                    }

                    if (level <= message.Level)
                    {
                        messages.Add(message);
                    }

                    if (message.IsDispose)
                    {
                        disposeMessage = (DisposeLogMessage)message;
                    }
                    else if (LocalTimeZone != null)
                    {
                        message.Time = message.Time.Convert(LocalTimeZone);
                    }
                }

                if (messages.Count > 0)
                {
                    _listeners.Cache.ForEach(l => l.WriteMessages(messages));
                }

                disposeMessage?.Pulse();
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
            finally
            {
                lock (_syncRoot)
                    _isFlusing = false;
            }
        }