Esempio n. 1
0
        public void Emit(LogEvent logEvent)
        {
            if (logEvent == null)
            {
                throw new ArgumentNullException(nameof(logEvent));
            }

            string logMessage = null;

            if (logEvent.Properties.ContainsKey("Class"))
            {
                LogEventPropertyValue property;
                if (logEvent.Properties.TryGetValue("Class", out property))
                {
                    var render = new StringWriter();
                    _textFormatterClass.Format(logEvent, render);
                    logMessage = LogManager.logPrefix + render.ToString();

                    string ignoreClass = property.ToString();
                    if (ignoreHashSet.Contains(ignoreClass))
                    {
                        if (!String.IsNullOrWhiteSpace(LogManager.outputLogFile))
                        {
                            File.AppendAllText(LogManager.outputLogFile, logMessage);
                        }
                        return;
                    }
                }
            }
            else
            {
                var renderSpace = new StringWriter();
                _textFormatter.Format(logEvent, renderSpace);
                logMessage = LogManager.logPrefix + renderSpace.ToString();
            }

            if (!String.IsNullOrWhiteSpace(LogManager.outputLogFile))
            {
                File.AppendAllText(LogManager.outputLogFile, logMessage);
            }

            //Raise the event on the delegate's thread, should be UI.
            //Necessary otherwise deadlocks ensue and handshake failure due to cross-thread calls..
            RaiseEventOnUIThread(OnLogEvent, logMessage);
        }
Esempio n. 2
0
        public void Emit(LogEvent logEvent)
        {
            if (logEvent == null)
            {
                throw new ArgumentNullException(nameof(logEvent));
            }

            var sr = new StringWriter();

            textFormatter.Format(logEvent, sr);
            var text = sr.ToString().Trim();

            var category = logEvent.Properties.TryGetValue("SourceContext", out var value) ? value.ToString() : "";
            var logger   = loggerCategories.GetOrAdd(category, s => CoreLoggerFactory.CreateLogger(s));

            switch (logEvent.Level)
            {
            case LogEventLevel.Fatal:
                logger.LogCritical(text);
                break;

            case LogEventLevel.Error:
                logger.LogError(text);
                break;

            case LogEventLevel.Warning:
                logger.LogWarning(text);
                break;

            case LogEventLevel.Information:
                logger.LogInformation(text);
                break;

            case LogEventLevel.Debug:
                logger.LogDebug(text);
                break;

            case LogEventLevel.Verbose:
                logger.LogTrace(text);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Esempio n. 3
0
        protected override async Task EmitBatchAsync(IEnumerable <LogEvent> events)
        {
            var tasks = new List <Task>();

            foreach (var logEvent in events)
            {
                using (var render = new StringWriter(CultureInfo.InvariantCulture))
                {
                    formatter.Format(logEvent, render);
                    var message = new Message <Null, byte[]> {
                        Value = Encoding.UTF8.GetBytes(render.ToString())
                    };
                    tasks.Add(producer.ProduceAsync(topic, message));
                }
            }

            await Task.WhenAll(tasks);
        }
        public void Emit(LogEvent logEvent)
        {
            if (logEvent == null)
            {
                throw new ArgumentNullException(nameof(logEvent));
            }
            var renderSpace = new StringWriter();

            _textFormatter.Format(logEvent, renderSpace);
            //            Events.Enqueue(renderSpace.ToString());
            var valueToAdd = renderSpace.ToString();

            Application.Current.Dispatcher.Invoke(new Action(() =>
            {
                _debugOutput.Items.Add(valueToAdd);
                _debugOutput.ScrollIntoView(valueToAdd);
            }));
        }
        public SerializedClefLog CreateFromEvents(IEnumerable <LogEvent> logEvents)
        {
            if (logEvents == null)
            {
                throw new ArgumentNullException(nameof(logEvents));
            }

            using (var memory = new MemoryStream())
            {
                var      result     = SerializedClefLog.Empty;
                LogEvent firstEvent = null;
                LogEvent lastEvent  = null;

                using (var zipArchive = new ZipArchive(memory, ZipArchiveMode.Create, false))
                    using (var zip = zipArchive.CreateEntry("log.clef").Open())
                        using (var writer = new StreamWriter(zip, Encoding.UTF8, 1024, false))
                        {
                            foreach (var logEvent in logEvents)
                            {
                                if (firstEvent == null)
                                {
                                    firstEvent = logEvent;
                                }

                                m_formatter.Format(logEvent, writer);

                                lastEvent = logEvent;
                            }

                            writer.Flush();
                            zip.Flush();
                        }

                if (firstEvent != null)
                {
                    result = new SerializedClefLog(
                        firstEvent.Timestamp,
                        lastEvent.Timestamp,
                        new MemoryStream(memory.GetBuffer(), false));
                }

                return(result);
            }
        }
Esempio n. 6
0
        private async void TryConnectToServer()
        {
            await targetProtocol.Connect();

            var localLogger = new LoggerConfiguration().WriteTo.Sink(this, LogEventLevel.Verbose).CreateLogger();

            localLogger.Information("Source Process: {AssignProcessName}",
                                    Assembly.GetEntryAssembly()?.GetName().Name ?? "No Name");
            while (true)
            {
                var logEvent = await buffer.Reader.ReadAsync();

                using var ms    = new MemoryStream();
                using var write = new StreamWriter(ms);
                format.Format(logEvent, write);
                write.Flush();
                await targetProtocol.Write(ms.GetBuffer(), 0, (int)ms.Length);
            }
        }
Esempio n. 7
0
        /// <summary>
        /// Emit the provided log event to the sink.
        /// </summary>
        /// <param name="logEvent">The log event to write.</param>
        public void Emit(LogEvent logEvent)
        {
            if (logEvent == null)
            {
                throw new ArgumentNullException("logEvent");
            }
            var renderSpace = new StringWriter();

            _textFormatter.Format(logEvent, renderSpace);

            var tag = logEvent.Properties.Where(x => x.Key == Constants.SourceContextPropertyName).Select(x => x.Value.ToString("l", null)).FirstOrDefault() ?? "";

            switch (logEvent.Level)
            {
            case LogEventLevel.Debug:
                AndroidLog.Debug(tag, renderSpace.ToString());
                break;

            case LogEventLevel.Information:
                AndroidLog.Info(tag, renderSpace.ToString());
                break;

            case LogEventLevel.Verbose:
                AndroidLog.Verbose(tag, renderSpace.ToString());
                break;

            case LogEventLevel.Warning:
                AndroidLog.Warn(tag, renderSpace.ToString());
                break;

            case LogEventLevel.Error:
                AndroidLog.Error(tag, renderSpace.ToString());
                break;

            case LogEventLevel.Fatal:
                AndroidLog.Wtf(tag, renderSpace.ToString());
                break;

            default:
                AndroidLog.WriteLine(LogPriority.Assert, tag, renderSpace.ToString());
                break;
            }
        }
        private string FormatPayload(IEnumerable <LogEvent> events)
        {
            var payload = new StringWriter();

            payload.Write("{\"events\":[");

            var delimStart = "";

            foreach (var logEvent in events)
            {
                payload.Write(delimStart);
                formatter.Format(logEvent, payload);

                delimStart = ",";
            }

            payload.Write("]}");
            return(payload.ToString());
        }
Esempio n. 9
0
        /// <summary>
        /// Emit a batch of log events to datadog.
        /// </summary>
        /// <param name="events">The events to emit.</param>
        /// <remarks>Override either <see cref="PeriodicBatchingSink.EmitBatch"/> or <see cref="PeriodicBatchingSink.EmitBatchAsync"/>,
        /// not both.</remarks>
        protected override void EmitBatch(IEnumerable <LogEvent> events)
        {
            if (events == null)
            {
                throw new ArgumentNullException("events");
            }

            foreach (var logEvent in events)
            {
                var payload   = new StringWriter();
                var title     = "Log Event - " + logEvent.Level;
                var alertType = GetAlertTypeFromEvent(logEvent);

                _textFormatter.Format(logEvent, payload);
                _statsd.Add(title, payload.ToString(), alertType, hostname: _datadogConfiguration.Hostname, tags: _datadogConfiguration.Tags);
            }

            _statsd.Send();
        }
        /// <summary>
        /// Create a log event entity from a Serilog <see cref="LogEvent"/>.
        /// </summary>
        /// <param name="log">The event to log</param>
        /// <param name="formatProvider"></param>
        /// <param name="textFormatter"></param>
        /// <param name="partitionKey">partition key to store</param>
        /// <param name="rowKey">row key to store</param>
        public LogEventEntity(
            LogEvent log,
            ITextFormatter textFormatter,
            string partitionKey,
            string rowKey)
        {
            Timestamp       = log.Timestamp.ToUniversalTime();
            PartitionKey    = partitionKey;
            RowKey          = GetValidRowKey(rowKey);
            MessageTemplate = log.MessageTemplate.Text;
            Level           = log.Level.ToString();
            Exception       = log.Exception?.ToString();
            RenderedMessage = log.RenderMessage();

            //Use the underlying TextFormatter to serialise the entire JSON object for the data column
            var s = new StringWriter();

            textFormatter.Format(log, s);
            Data = s.ToString();
        }
Esempio n. 11
0
    public void Emit(LogEvent logEvent)
    {
        if (logEvent.Properties.ContainsKey(skipUnityLogEventSinkPropertyName))
        {
            return;
        }

        using (StringWriter stringBuffer = new())
        {
            formatter.Format(logEvent, stringBuffer);
            // Need to escape curly braces because Debug.LogFormat is used
            string logString = stringBuffer.ToString().Trim()
                               .Replace("{", "{{")
                               .Replace("}", "}}")
                               + unityLogEventSinkMarker;
            LogType            logType       = GetUnityLogType(logEvent);
            UnityEngine.Object contextObject = GetUnityEngineContextObject(logEvent);
            Debug.LogFormat(logType, LogOption.NoStacktrace, contextObject, logString);
        }
    }
Esempio n. 12
0
        /// <inheritdoc/>
        /// <exception cref="ArgumentNullException">Thrown when <paramref name="logEvent"/> is <c>null</c>.</exception>
        public void Emit(LogEvent logEvent)
        {
            if (logEvent is null)
            {
                throw new ArgumentNullException(nameof(logEvent));
            }

            if (!_messageSender.CanTrySend)
            {
                _log.Warn("Sink not initialized. Dropping log entry");

                return;
            }

            _messageSender.TrySend(
                _formatter.Format(logEvent),
                _source.SourceName,
                _source.SourceCategory,
                _source.SourceHost);
        }
Esempio n. 13
0
        public void Emit(LogEvent logEvent)
        {
            var renderMessage = logEvent.RenderMessage();

            logEvent.AddPropertyIfAbsent(new LogEventProperty("RenderMessage", new ScalarValue(renderMessage)));

            var strWriter = new StringWriter();

            _formatter.Format(logEvent, strWriter);
            var jsonMessage = strWriter.ToString();

            var destinationAddress  = Dns.GetHostAddresses(_destination).FirstOrDefault(p => p.AddressFamily == AddressFamily.InterNetwork);
            var destinationEndpoint = new IPEndPoint(destinationAddress, 8086);
            var logPackage          = Encoding.ASCII.GetBytes(jsonMessage);

            lock (_lock)
            {
                _udpClient.Send(logPackage, logPackage.Length, destinationEndpoint);
            }
        }
Esempio n. 14
0
    private void GenerateEntry(
        LokiLogEvent lokiLogEvent,
        ITextFormatter formatter,
        LokiStream stream)
    {
        var buffer = new StringWriter(new StringBuilder(DefaultWriteBufferCapacity));

        var logEvent  = lokiLogEvent.LogEvent;
        var timestamp = logEvent.Timestamp;

        if (_useInternalTimestamp)
        {
            logEvent.AddPropertyIfAbsent(
                new LogEventProperty("Timestamp", new ScalarValue(timestamp)));
            timestamp = lokiLogEvent.InternalTimestamp;
        }

        formatter.Format(logEvent, buffer);

        stream.AddEntry(timestamp, buffer.ToString().TrimEnd('\r', '\n'));
    }
Esempio n. 15
0
        public void Emit(LogEvent logEvent)
        {
            if (logEvent.Level < _minimumLevel)
            {
                return;
            }

            var writer = new StringWriter();

            _textFormatter.Format(logEvent, writer);

            var renderedString = writer.ToString();

            var request = new PublishRequest
            {
                TopicArn = _logTopicArn,
                Message  = renderedString
            };

            _snsClient.PublishAsync(request).GetAwaiter().GetResult();
        }
        private string RenderLogEventColumn(LogEvent logEvent)
        {
            LogEvent preparedLogEvent;

            if (_columnOptions.LogEvent.ExcludeAdditionalProperties)
            {
                var filteredProperties = logEvent.Properties.Where(p => !_additionalColumnPropertyNames.Contains(p.Key));
                preparedLogEvent = new LogEvent(logEvent.Timestamp, logEvent.Level, logEvent.Exception, logEvent.MessageTemplate,
                                                filteredProperties.Select(x => new LogEventProperty(x.Key, x.Value)));
            }
            else
            {
                preparedLogEvent = logEvent;
            }

            var sb = new StringBuilder();

            using (var writer = new System.IO.StringWriter(sb))
                _logEventFormatter.Format(preparedLogEvent, writer);
            return(sb.ToString());
        }
Esempio n. 17
0
        /// <summary>
        /// Emit a batch of log events, running to completion synchronously.
        /// </summary>
        /// <param name="events">The events to emit.</param>
        protected override void EmitBatch(IEnumerable <LogEvent> events)
        {
            var batchedEvents = new List <EventData>();

            foreach (var logEvent in events)
            {
                var render = new StringWriter();
                _formatter.Format(logEvent, render);

                var eventHubData = new EventData(Encoding.UTF8.GetBytes(render.ToString()))
                {
                    PartitionKey = _partitionKey
                };
                eventHubData.Properties.Add(
                    "Type", "SerilogEvent_" + DateTime.Now.ToLongTimeString());

                batchedEvents.Add(eventHubData);
            }

            _eventHubClient.SendBatch(batchedEvents);
        }
#pragma warning disable VSTHRD010
        /// <inheritdoc/>
        public void Emit(LogEvent logEvent)
        {
            var sw = new StringWriter();

            _formatter.Format(logEvent, sw);
            var message = sw.ToString();

            if (_pane is IVsOutputWindowPaneNoPump noPump)
            {
                noPump.OutputStringNoPump(message);
            }
            else
            {
                ErrorHandler.ThrowOnFailure(_pane.OutputStringThreadSafe(message));
            }

            if (logEvent.Level == LogEventLevel.Error)
            {
                _pane.Activate();
            }
        }
Esempio n. 19
0
        /// <summary>
        /// Format the log events into a payload.
        /// </summary>
        /// <param name="logEvents">
        /// The events to format.
        /// </param>
        /// <param name="formatter">
        /// The formatter turning the log events into a textual representation.
        /// </param>
        /// <param name="output">
        /// The payload to send over the network.
        /// </param>
        public void Format(IEnumerable <LogEvent> logEvents, ITextFormatter formatter, TextWriter output)
        {
            if (logEvents == null)
            {
                throw new ArgumentNullException(nameof(logEvents));
            }
            if (formatter == null)
            {
                throw new ArgumentNullException(nameof(formatter));
            }

            IEnumerable <string> formattedLogEvents = logEvents.Select(
                logEvent =>
            {
                var writer = new StringWriter();
                formatter.Format(logEvent, writer);
                return(writer.ToString());
            });

            Format(formattedLogEvents, output);
        }
Esempio n. 20
0
        protected override async Task EmitBatchAsync(IEnumerable <LogEvent> events)
        {
            foreach (var logEvent in events)
            {
                var sw = new StringWriter();
                _formatter.Format(logEvent, sw);

                var loggerName = "Default";
                if (logEvent.Properties.TryGetValue(global::Serilog.Core.Constants.SourceContextPropertyName, out LogEventPropertyValue sourceContext))
                {
                    var sv = sourceContext as ScalarValue;
                    if (sv?.Value is string value)
                    {
                        loggerName = value;
                    }
                }

                await _eventBus.Publish(new WriteLogEvent(sw.ToString(), logEvent.Timestamp.DateTime, 1,
                                                          (int)logEvent.Level, loggerName)).ConfigureAwait(false);
            }
        }
Esempio n. 21
0
        void UpdateLog(LogEvent loggingEvent)
        {
            if (Logs.Count > MaxTextLength)
            {
                Clear();
            }

            var sr = new StringWriter();

            textFormatter.Format(loggingEvent, sr);
            var log = sr.ToString();

            switch (loggingEvent.Level)
            {
            case LogEventLevel.Information:
                Logs.Add(new LogMessage(log, Colors.Black, true));
                break;

            case LogEventLevel.Warning:
                Logs.Add(new LogMessage(log, Colors.DarkOrange));
                break;

            case LogEventLevel.Error:
                Logs.Add(new LogMessage(log, Colors.Red));
                break;

            case LogEventLevel.Fatal:
                Logs.Add(new LogMessage(log, Colors.DarkOrange));
                break;

            case LogEventLevel.Debug:
                Logs.Add(new LogMessage(log, Colors.Green));
                break;

            default:
                Logs.Add(new LogMessage(log, Colors.Black));
                break;
            }
        }
Esempio n. 22
0
        public void WriteFormattedLogEvents()
        {
            // Arrange
            var batchFormatter = new DefaultBatchFormatter();

            var formattedLogEvents = logEvents.Select(logEvent =>
            {
                var formattedLogEvent = new StringWriter();
                textFormatter.Format(logEvent, formattedLogEvent);
                return(formattedLogEvent.ToString());
            });

            // Act
            batchFormatter.Format(formattedLogEvents, output);

            // Assert
            var got = JsonConvert.DeserializeObject <DefaultBatch>(output.ToString());

            got.Events.Length.ShouldBe(2);
            got.Events[0].RenderedMessage.ShouldBe("Event 1");
            got.Events[1].RenderedMessage.ShouldBe("Event 2");
        }
        public void WriteFormattedLogEvents()
        {
            // Arrange
            var batchFormatter = new ArrayBatchFormatter();

            var formattedLogEvents = logEvents.Select(logEvent =>
            {
                var formattedLogEvent = new StringWriter();
                textFormatter.Format(logEvent, formattedLogEvent);
                return(formattedLogEvent.ToString());
            });

            // Act
            batchFormatter.Format(formattedLogEvents, output);

            // Assert
            var actual = JsonConvert.DeserializeObject <NormalTextLogEvent[]>(output.ToString());

            actual.Length.ShouldBe(2);
            actual[0].RenderedMessage.ShouldBe("Event 1");
            actual[1].RenderedMessage.ShouldBe("Event 2");
        }
Esempio n. 24
0
        public void Emit(LogEvent logEvent)
        {
            if (logEvent == null)
            {
                throw new ArgumentNullException(nameof(logEvent));
            }

            var renderSpace = new StringWriter();

            _textFormatter.Format(logEvent, renderSpace);

            var levelName = Enum.GetName(typeof(LogEventLevel), logEvent.Level);

            if (logEvent.Level > LogEventLevel.Warning)
            {
                LogsStore.Instance.Errors.Add(
                    new LogMessage(logEvent.Timestamp.LocalDateTime, levelName, renderSpace.ToString()));
            }

            LogsStore.Instance.Logs.Add(new LogMessage(logEvent.Timestamp.LocalDateTime, levelName,
                                                       renderSpace.ToString()));
        }
Esempio n. 25
0
        public void Emit(LogEvent logEvent)
        {
            var sb = new StringBuilder();

            _formatter.Format(logEvent, new StringWriter(sb));
            var data = sb.ToString().Replace("RenderedMessage", "message");

            Task.Factory.StartNew(async() =>
            {
                try
                {
                    using (var httpClient = new HttpClient(_msgHandler, false))
                    {
                        var content = new StringContent(data);
                        content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                        content.Headers.Add("ApiKey", _apiKey);

                        await httpClient.PostAsync(_url, content);
                    }
                } catch  { } /* This is a logging framework. We don't care about logs not succeeding */
            });
        }
Esempio n. 26
0
        protected override Task EmitBatchAsync(IEnumerable <LogEvent> events)
        {
            var semaphore = new SemaphoreSlim(Environment.ProcessorCount);

            return(Task.WhenAll(events.Select(async e =>
            {
                await semaphore.WaitAsync();

                try
                {
                    using (var writerHolder = _stringWriterPool.Get())
                    {
                        _formatter.Format(e, writerHolder.Object);
                        await _producer.ProduceAsync(writerHolder.Object.ToString());
                    }
                }
                finally
                {
                    semaphore.Release();
                }
            })));
        }
Esempio n. 27
0
        private async Task Send(IEnumerable <LogEvent> events)
        {
            var allEvents = new StringWriter();

            foreach (var logEvent in events)
            {
                _jsonFormatter.Format(logEvent, allEvents);
            }

            var request  = new EventCollectorRequest(_splunkHost, allEvents.ToString(), _uriPath);
            var response = await _httpClient.SendAsync(request).ConfigureAwait(false);

            if (response.IsSuccessStatusCode)
            {
                //Do Nothing?
            }
            else
            {
                //Application Errors sent via HTTP Event Collector
                if (HttpEventCollectorApplicationErrors.Any(x => x == response.StatusCode))
                {
                    SelfLog.WriteLine(
                        "A status code of {0} was received when attempting to send to {1}.  The event has been discarded and will not be placed back in the queue.",
                        response.StatusCode.ToString(), _splunkHost);
                }
                else
                {
                    //Put the item back in the queue & retry on next go
                    SelfLog.WriteLine(
                        "A status code of {0} was received when attempting to send to {1}.  The event has been placed back in the queue",
                        response.StatusCode.ToString(), _splunkHost);

                    foreach (var logEvent in events)
                    {
                        _queue.Enqueue(logEvent);
                    }
                }
            }
        }
Esempio n. 28
0
        protected override async Task EmitBatchAsync(IEnumerable <LogEvent> events)
        {
            Stream stream;

            try
            {
                stream = await _blob.OpenWriteAsync(false);
            }
            catch (StorageException ex) when(ex.RequestInformation.HttpStatusCode == 404)
            {
                // When the blob doesn't already exist, create it
                stream = await _blob.OpenWriteAsync(true);
            }

            using (StreamWriter writer = new StreamWriter(stream))
            {
                foreach (LogEvent evnt in events)
                {
                    _formatter.Format(evnt, writer);
                }
            }
        }
Esempio n. 29
0
        public async Task EmitBatchAsync(IEnumerable <LogEvent> events)
        {
            var timestamp       = DateTimeOffset.Now.ToUnixTimeMilliseconds();
            var secretEnc       = Encoding.UTF8.GetBytes(_connectionInfo.Secret);
            var stringToSign    = $"{timestamp}\n{_connectionInfo.Secret}";
            var stringToSignEnc = Encoding.UTF8.GetBytes(stringToSign);
            var hmac256         = new HMACSHA256(secretEnc);
            var hashMessage     = hmac256.ComputeHash(stringToSignEnc);
            var sign            = Convert.ToBase64String(hashMessage);
            var payload         = new StringWriter();

            foreach (var logEvent in events)
            {
                _textFormatter.Format(logEvent, payload);
            }
            RobotMessageText robotMessage = new RobotMessageText();

            robotMessage.text.content = payload.ToString();
            var str = new StringContent(JsonConvert.SerializeObject(robotMessage), Encoding.UTF8,
                                        "application/json");
            await _client.PostAsync($"{BaseUrl}{_connectionInfo.Token}&timestamp={timestamp}&sign={sign}", str);
        }
        /// <summary>
        /// Emit a batch of log events, running to completion synchronously.
        /// </summary>
        /// <param name="events">The events to emit.</param>
        /// <remarks>
        /// Override either <see cref="M:Serilog.Sinks.PeriodicBatching.PeriodicBatchingSink.EmitBatchAsync(System.Collections.Generic.IEnumerable{Serilog.Events.LogEvent})" /> or <see cref="M:Serilog.Sinks.PeriodicBatching.PeriodicBatchingSink.EmitBatchAsync(System.Collections.Generic.IEnumerable{Serilog.Events.LogEvent})" />,
        /// not both.
        /// </remarks>
        protected override async Task EmitBatchAsync(IEnumerable <LogEvent> events)
        {
            if (events.Any() == false)
            {
                await Task.FromResult(0);
            }

            if (_client == null)
            {
                _client = new LeClient(false, _useSsl, _url);
            }

            await _client.ConnectAsync().ConfigureAwait(false);

            foreach (var logEvent in events)
            {
                var renderSpace = new StringWriter();
                _textFormatter.Format(logEvent, renderSpace);

                var renderedString = renderSpace.ToString();

                // LogEntries uses a NewLine character to determine the end of a log message
                // this causes problems with stack traces.
                if (!string.IsNullOrEmpty(renderedString))
                {
                    renderedString = renderedString.Replace("\n", "");
                }

                var finalLine = _token + renderedString + '\n';

                var data = Utf8.GetBytes(finalLine);

                await _client.WriteAsync(data, 0, data.Length).ConfigureAwait(false);
            }

            await _client.FlushAsync().ConfigureAwait(false);

            _client.Close();
        }
Esempio n. 31
0
        /// <summary>
        /// Recourse against the current property path to retrieve the property value to return.
        /// </summary>
        /// <param name="obj">The object containing the value to extract.</param>
        /// <param name="currentPathIndex">
        /// The recursion index, indicating the current position in the property path.
        /// </param>
        /// <param name="textFormatter">
        /// The formatter that will be used to format the entity or property values.
        /// </param>
        /// <returns>
        /// The formatted property value obtained matching the current <see cref="FormatParameters" /> 
        /// against the specified array of <see href="System.Object"/>s, and formatting the result
        /// using the specified <paramref name="textFormatter"/>.
        /// </returns>
        private string GetPropertyValue( object obj, int currentPathIndex, ITextFormatter textFormatter )
        {
            // if there is a constant value, returns it
            if ( this.Constant != null ) return textFormatter.Format( this.Format, Constant );

            // if object is null, cannot go ahead with the resolution.)
            if ( obj == null ) return textFormatter.Format( this.Format, null );

            // if the current property in the property path is null or empty,
            // should return the formatted whole object.
            var propertyName = currentPathIndex < this.PropertyPath.Count ? this.PropertyPath[currentPathIndex] : null;
            if ( string.IsNullOrEmpty( propertyName ) )
            {
                return textFormatter.Format( this.Format, obj );
            }

            // else extracts the current property
            var type = obj.GetType();
            var property = type.GetProperty( propertyName );
            if ( property == null )
                throw new FormatException( "Invalid property: " + propertyName );

            // extracts the property value from the object
            var propertyValue = property.GetValue( obj, null );

            // recourse to resolve the property value;
            return GetPropertyValue( propertyValue, currentPathIndex + 1, textFormatter );
        }