Beispiel #1
0
        private void SendQueuedItems()
        {
            Queue <LogEvent> queue;
            var batchBuilder = new StringBuilder();

            using (this.Lock())
            {
                queue = new Queue <LogEvent>(queuedEvents.Values.ToList());
                queuedEvents.Clear();
            }

            while (queue.Count > 0)
            {
                var    logEvent   = queue.Dequeue();
                var    logMessage = logEvent.MessageTemplate.Text;
                string source     = null;
                string eventId    = null;
                string eventMessage;

                logMessage = logEvent.RenderMessage();

                foreach (var property in logEvent.Properties)
                {
                    if (property.Key == "SourceContext")
                    {
                        source = property.Value.ToString().FormatCommandLineArg();
                    }
                    else if (property.Key == "EventId")
                    {
                        eventId = property.Value.ToString().FormatCommandLineArg();
                    }
                    else
                    {
                        //var pattern = $"\\{{\\s*?{ Regex.Escape(property.Key) }\\s*\\}}";

                        //logMessage = logMessage.RegexReplace(pattern, property.Value.ToString().RemoveQuotes());
                    }
                }

                if (eventId == null)
                {
                    eventId = $"{{ Id: { ++lastEventId }, Name: { source } }}".FormatCommandLineArg();
                }

                logMessage   = logMessage.FormatCommandLineArg();
                eventMessage = string.Format("EventId:{0} Timestamp:{1} Source:{2} Level:{3} LogMessage:{4}\t", eventId, DateTime.UtcNow.ToDateTimeText().SurroundWithQuotes(), source, logEvent.Level, logMessage);

                batchBuilder.Append(eventMessage);
            }

            if (batchBuilder.Length > 0)
            {
                try
                {
                    var eventMessage = string.Format("LOGBATCH {0}\r\n", batchBuilder.ToString());

                    client.Send(Encoding.ASCII.GetBytes(eventMessage));
                }
                catch
                {
                    Thread.Sleep(100);
                }
            }
        }