private async Task ReceiveLoop(PipeReader reader) { try { while (true) { var result = await reader.ReadAsync(); var buffer = result.Buffer; try { if (result.IsCanceled) { break; } while (EventPipeProtocol.TryParseMessage(ref buffer, out var message)) { switch (message) { case EventSourceCreatedMessage eventSourceCreatedMessage: _ = Task.Run(() => OnEventSourceCreated?.Invoke(eventSourceCreatedMessage)); break; case EventWrittenMessage eventWrittenMessage: _ = Task.Run(() => OnEventWritten?.Invoke(eventWrittenMessage)); break; default: throw new NotSupportedException($"Unsupported message type: {message.GetType().FullName}"); } } if (result.IsCompleted) { break; } } finally { reader.AdvanceTo(buffer.Start); } } } catch (Exception ex) { reader.Complete(ex); } finally { reader.Complete(); } }
private void HandleLoggerMessage(EventWrittenMessage inputMessage) { var payloadDict = Enumerable.Range(0, inputMessage.Payload.Count).ToDictionary( i => inputMessage.PayloadNames[i], i => inputMessage.Payload[i]); var args = (JArray)payloadDict["Arguments"]; var outputMessage = new EventWrittenMessage() { EventName = (string)payloadDict["EventId"], Level = MapLogLevel((long)payloadDict["Level"]), ProviderName = (string)payloadDict["LoggerName"], ActivityId = inputMessage.ActivityId, Channel = inputMessage.Channel, Version = inputMessage.Version, EventId = inputMessage.EventId, Keywords = inputMessage.Keywords, Opcode = inputMessage.Opcode, RelatedActivityId = inputMessage.RelatedActivityId, Tags = inputMessage.Tags, Task = inputMessage.Task, }; string messageFormat = null; var messageArgs = new Dictionary <string, string>(); foreach (var arg in args) { var obj = (JObject)arg; var key = obj.Value <string>("Key"); var value = obj.Value <string>("Value"); if (key.Equals("{OriginalFormat}")) { messageFormat = value; } else { outputMessage.PayloadNames.Add(key); outputMessage.Payload.Add(value); messageArgs.Add(key, value); } } if (messageFormat != null) { outputMessage.Message = LogValuesFormatter.Format(messageFormat, messageArgs); } _ = Task.Run(() => OnEventWritten?.Invoke(outputMessage)); }
private async Task ReceiveLoop(PipeReader reader) { Exception shutdownEx = null; try { while (true) { var result = await reader.ReadAsync(); var buffer = result.Buffer; try { if (result.IsCanceled) { return; } while (EventPipeProtocol.TryParseMessage(ref buffer, out var message)) { switch (message) { case EventSourceCreatedMessage eventSourceCreatedMessage: _ = Task.Run(() => OnEventSourceCreated?.Invoke(eventSourceCreatedMessage)); break; case EventWrittenMessage eventWrittenMessage: if (eventWrittenMessage.ProviderName.Equals("Microsoft-Extensions-Logging") && eventWrittenMessage.EventId == 2) { HandleLoggerMessage(eventWrittenMessage); } else if (eventWrittenMessage.EventId == -1 && eventWrittenMessage.EventName.Equals("EventCounters")) { HandleEventCounter(eventWrittenMessage); } else { if (eventWrittenMessage.Message != null && eventWrittenMessage.Payload.Count > 0) { // TODO: This is sketchy. eventWrittenMessage.Message = string.Format(eventWrittenMessage.Message, eventWrittenMessage.Payload.ToArray()); } _ = Task.Run(() => OnEventWritten?.Invoke(eventWrittenMessage)); } break; default: throw new NotSupportedException($"Unsupported message type: {message.GetType().FullName}"); } } if (result.IsCompleted) { return; } } finally { reader.AdvanceTo(buffer.Start); } } } catch (Exception ex) { reader.Complete(ex); shutdownEx = ex; } finally { _ = Task.Run(() => Disconnected?.Invoke(shutdownEx)); reader.Complete(); } }