예제 #1
0
        public async Task AddLog(LogItem logItem, bool writeLog = true)
        {
            try
            {
                await LogQueueLock.WaitAsync();

                if (CompactLog)
                {
                    var lastLogItem = LogQueue.LastOrDefault();
                    if (
                        LogMessageTypeEnum.Progress == logItem.Type &&
                        LogMessageTypeEnum.Progress == lastLogItem?.Type
                        )
                    {
                        LogQueue.Remove(lastLogItem);
                    }
                }

                LogQueue.Add(logItem);
                if (LogQueue.Count() > LogQueueSize)
                {
                    LogQueue.RemoveAt(0);
                }
            }
            finally
            {
                LogQueueLock.Release();
            }

            if (writeLog && null != WriteLog)
            {
                var totalLog = await GetLog();

                try
                {
                    if (null != WriteLog)
                    {
                        await WriteLog(totalLog);
                    }
                }
                catch (Exception e)
                {
                    try
                    {
                        Console.WriteLine($"failed to {nameof(WriteLog)}, exception message: {e.Message}");
                    }
                    catch { }
                }
            }
        }
예제 #2
0
        protected virtual void ProcessQueue(object state)
        {
            // если очередь переполнена, то почистим ее
            int maxSize     = Client.Config.Logs.WebLog.QueueBytes;
            int currentSize = LogQueue.Bytes();

            if (currentSize > maxSize)
            {
                Client.InternalLog.Warning("Очищаем очередь веб-логов");
                LogQueue.ClearBySize(maxSize / 2); // очищаем половину очереди
                Client.InternalLog.Debug("Очередь веб-логов очищена");
            }

            if (Disabled)
            {
                return;
            }

            if (LogQueue.Count() == 0)
            {
                return;
            }

            // если все потоки заняты, то ждем следующей итерации
            if (TaskQueue.HasFreeThreads == false)
            {
                return;
            }
            if (TaskQueue.RunTasks > 0)
            {
                return;
            }

            // если канал оффлайн, то ничего не отправляем
            if (Client.CanSendData == false)
            {
                return;
            }

            // если не можем вычислить разницу по времени, значит канал дохлый
            if (Client.CanConvertToServerDate() == false)
            {
                return;
            }

            // разбиваем все логи по пачкам и отправляем
            int batchSize = Client.Config.Logs.WebLog.BatchBytes;

            lock (LogQueue.SynchRoot)
            {
                // todo отправляются ВСЕ логи которые сейчас в очереди,
                // т.е. по факту в памяти будет логов = размер очереди * 2 (1 часть логов в тасках, 2-ая в очереди),
                // надо подумать можно ли так много доставать из очереди
                while (true)
                {
                    // получим пачку логов для отправки
                    var batchLogs = LogQueue.GetBatchMessages(batchSize);
                    if (batchLogs.Count == 0)
                    {
                        Order = 0;
                        return;
                    }

                    // установим серверное время
                    foreach (var log in batchLogs)
                    {
                        if (log.Date == null)
                        {
                            log.Date = Client.ToServerTime(log.CreateDate);
                        }
                    }

                    // отправим
                    TaskQueue.Add(SendBatchLogs, batchLogs, "SendBatchLogs");
                }
            }
        }
예제 #3
0
 public int GetQueueCount()
 {
     return(LogQueue.Count());
 }