private EventArrivedEventArgs CreateEventArgsFromEventRecord(EventRecord eventRecord) { using (TraceEventInfoWrapper traceEventInfo = new TraceEventInfoWrapper(eventRecord)) { Guid providerId = eventRecord.EventHeader.ProviderId; try { // Get the properties using the current event information (schema). IList <PropertyItem> properties = traceEventInfo.GetProperties(eventRecord); string fmtmsg = traceEventInfo.GetMessage(); string message = traceEventInfo.FormatMessage(fmtmsg, properties.Select(p => p.Value.ToString()).ToArray()); EventArrivedEventArgs args = new EventArrivedEventArgs(providerId, traceEventInfo.EventName, properties); args.Message = message; args.LogDateTime = DateTime.FromFileTime(eventRecord.EventHeader.TimeStamp); args.Task = traceEventInfo.GetTask(); args.Level = eventRecord.EventHeader.EventDescriptor.Level; args.LevelName = traceEventInfo.GetLevelName(); args.ProcessId = eventRecord.EventHeader.ProcessId; args.ThreadId = eventRecord.EventHeader.ThreadId; return(args); } catch (Exception e) { // there are some error when creating a event arg, so use the exception as the message EventArrivedEventArgs args = new EventArrivedEventArgs(e); args.Task = string.Empty; return(args); } } }
/// <summary> /// The create event args from event record. /// </summary> /// <param name="eventRecord"> /// The event record. /// </param> /// <returns> /// The <see cref="EventArrivedEventArgs"/>. /// </returns> private EventArrivedEventArgs CreateEventArgsFromEventRecord(EventRecord eventRecord) { var eventOpcode = eventRecord.EventHeader.EventDescriptor.Opcode; TraceEventInfoWrapper traceEventInfo; var shouldDispose = false; // Find the event information (schema). var index = this.traceEventInfoCache.IndexOfKey(eventOpcode); if (index >= 0) { traceEventInfo = this.traceEventInfoCache.Values[index]; } else { traceEventInfo = new TraceEventInfoWrapper(eventRecord); try { this.traceEventInfoCache.Add(eventOpcode, traceEventInfo); } catch (ArgumentException) { // Some other thread added this entry. shouldDispose = true; } } // Get the properties using the current event information (schema). var properties = traceEventInfo.GetProperties(eventRecord); // Dispose the event information because it doesn't live in the cache if (shouldDispose) { traceEventInfo.Dispose(); } var args = new EventArrivedEventArgs(eventOpcode, properties); return(args); }
private EventArrivedEventArgs CreateEventArgsFromEventRecord(EventRecord eventRecord) { if (traceEventInfoCache == null) { return(null); } Guid providerId = eventRecord.EventHeader.ProviderId; TraceEventInfoWrapper traceEventInfo; byte[] key = CreateComposedKey(providerId, eventRecord.EventHeader.EventDescriptor.Opcode); bool shouldDispose = false; // Find the event information (schema). if (!traceEventInfoCache.TryGetValue(key, out traceEventInfo)) { traceEventInfo = new TraceEventInfoWrapper(eventRecord); try { traceEventInfoCache.Add(key, traceEventInfo); } catch (ArgumentException) { // Someone other thread added this entry. shouldDispose = true; } } // Get the properties using the current event information (schema). PropertyBag properties = traceEventInfo.GetProperties(eventRecord); EventArrivedEventArgs args = CreateEventArgs(); args.Timestamp = eventRecord.EventHeader.TimeStamp; args.ProviderId = providerId; args.EventId = eventRecord.EventHeader.EventDescriptor.Id; args.EventName = traceEventInfo.EventName; args.Properties = properties; IntPtr addr = eventRecord.UserData; int length = eventRecord.UserDataLength; if (addr != IntPtr.Zero && length > 0) { byte[] buffer = new byte[length]; for (int i = 0; i < length; i++) { buffer[i] = Marshal.ReadByte(addr); addr = new IntPtr((long)addr + 1); } using (System.IO.BinaryReader reader = new System.IO.BinaryReader(new System.IO.MemoryStream(buffer))) { args.ParseUserData(args.EventId, reader); } } // Dispose the event information because it doesn't live in the cache if (shouldDispose) { traceEventInfo.Dispose(); } return(args); }