Beispiel #1
0
        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);
        }