/// <summary> /// Reads the log item fields from the specified log file reader. /// </summary> /// <param name="reader">The log file reader to read from.</param> /// <param name="isRepeated">true if the log item is repeated from a previous file, false if it is written for the first time.</param> /// <returns>The read log item.</returns> internal static FieldLogScopeItem Read(FieldLogFileReader reader, bool isRepeated) { FieldLogScopeItem item = new FieldLogScopeItem(); item.ReadBaseData(reader); item.IsRepeated = isRepeated; item.Type = (FieldLogScopeType)reader.ReadByte(); item.Level = reader.ReadInt32(); item.Name = reader.ReadString(); if (item.Type == FieldLogScopeType.ThreadStart) { byte flags = reader.ReadByte(); item.IsBackgroundThread = (flags & 1) != 0; item.IsPoolThread = (flags & 2) != 0; } if (item.Type == FieldLogScopeType.LogStart) { item.EnvironmentData = FieldLogEventEnvironment.Read(reader); } if (item.Type == FieldLogScopeType.WebRequestStart && reader.FormatVersion >= 2) { item.WebRequestData = FieldLogWebRequestData.Read(reader); } return(item); }
/// <summary> /// Reads the exception fields from the specified log file reader. /// </summary> /// <param name="reader">The log file reader to read from.</param> /// <returns>The exception data.</returns> internal static FieldLogException Read(FieldLogFileReader reader) { FieldLogException ex = new FieldLogException(); ex.Type = reader.ReadString(); if (reader.FormatVersion >= 2) { ex.TypeModule = reader.ReadString(); ex.Token = reader.ReadInt32(); } ex.Message = reader.ReadString(); ex.Code = reader.ReadInt32(); ex.Data = reader.ReadString(); int frameCount = reader.ReadInt32(); ex.StackFrames = new FieldLogStackFrame[frameCount]; for (int i = 0; i < frameCount; i++) { ex.StackFrames[i] = FieldLogStackFrame.Read(reader); } int innerCount = reader.ReadInt32(); ex.InnerExceptions = new FieldLogException[innerCount]; for (int i = 0; i < innerCount; i++) { ex.InnerExceptions[i] = FieldLogException.Read(reader); } return(ex); }
/// <summary> /// Reads the log item fields from the specified log file reader. /// </summary> /// <param name="reader">The log file reader to read from.</param> /// <returns>The read log item.</returns> internal static FieldLogDataItem Read(FieldLogFileReader reader) { FieldLogDataItem item = new FieldLogDataItem(); item.ReadBaseData(reader); item.Name = reader.ReadString(); item.Value = reader.ReadString(); return(item); }
/// <summary> /// Reads the log item fields from the specified log file reader. /// </summary> /// <param name="reader">The log file reader to read from.</param> /// <returns>The read log item.</returns> internal static FieldLogTextItem Read(FieldLogFileReader reader) { FieldLogTextItem item = new FieldLogTextItem(); item.ReadBaseData(reader); item.Text = reader.ReadString(); item.Details = reader.ReadString(); return(item); }
/// <summary> /// Reads the log item fields from the specified log file reader. /// </summary> /// <param name="reader">The log file reader to read from.</param> /// <returns>The read log item.</returns> internal static FieldLogExceptionItem Read(FieldLogFileReader reader) { FieldLogExceptionItem item = new FieldLogExceptionItem(); item.ReadBaseData(reader); item.Exception = FieldLogException.Read(reader); item.Context = reader.ReadString(); item.EnvironmentData = FieldLogEventEnvironment.Read(reader); return(item); }
/// <summary> /// Sets the close signal for the currently used log file reader. /// </summary> public void Close() { reader.Close(); // Also close all other readers of this enumerator, just to be sure FieldLogFileReader r = firstReader; do { r.Close(); r = r.NextReader; }while (r != null); }
/// <summary> /// Disposes of all FieldLogFileReader in this enumerator, beginning with the first. /// </summary> public void Dispose() { FieldLogFileReader r = firstReader; while (r != null) { FieldLogFileReader r2 = r; r = r.NextReader; r2.Dispose(); } GC.SuppressFinalize(this); }
/// <summary> /// Reads the common log item fields from the specified log file reader. /// </summary> /// <param name="reader">The log file reader to read from.</param> protected void ReadBaseData(FieldLogFileReader reader) { LogItemSourceFileName = reader.FileName; FileFormatVersion = reader.FormatVersion; Time = new DateTime(reader.ReadInt64(), DateTimeKind.Utc); EventCounter = reader.ReadInt32(); Priority = (FieldLogPriority)reader.ReadByte(); SessionId = new Guid(reader.ReadBytes(16)); ThreadId = reader.ReadInt32(); if (reader.FormatVersion >= 2) { WebRequestId = reader.ReadUInt32(); } }
/// <summary> /// Determines whether the enumerator contains the specified log file. /// </summary> /// <param name="fileName">The full name of the log file to locate in the enumerator.</param> /// <returns>true if the enumerator contains the specified log file reader; otherwise, false.</returns> public bool ContainsFile(string fileName) { FieldLogFileReader r = firstReader; while (r != null) { if (r.FileName == fileName) { return(true); } r = r.NextReader; } return(false); }
/// <summary> /// Reads the stack frame fields from the specified log file reader. /// </summary> /// <param name="reader">The log file reader to read from.</param> /// <returns>The stack frame data.</returns> internal static FieldLogStackFrame Read(FieldLogFileReader reader) { FieldLogStackFrame frame = new FieldLogStackFrame(); frame.Module = reader.ReadString(); if (reader.FormatVersion >= 2) { frame.Token = reader.ReadInt32(); frame.ILOffset = reader.ReadInt32(); } frame.TypeName = reader.ReadString(); frame.MethodName = reader.ReadString(); frame.MethodSignature = reader.ReadString(); frame.FileName = reader.ReadString(); frame.Line = reader.ReadInt32(); frame.Column = reader.ReadInt32(); return(frame); }
/// <summary> /// Creates a new log file reader and adds it to the priority's log file enumerator. /// </summary> /// <param name="prio">The priority of files to write.</param> /// <param name="fileName">The name of the log file.</param> /// <param name="fromFsw">Indicates whether the reader was created from a FileSystemWatcher event.</param> private void AddNewReader(FieldLogPriority prio, string fileName, bool fromFsw) { // Must be within a lock(readerLock)! FL.Trace("AddNewReader, prio=" + prio + ", fileName=" + Path.GetFileName(fileName) + ", fromFsw=" + fromFsw); // Reject the new file if it's already in the queue (delayed FSW event after active scan) if (readers.ContainsKey(prio) && readers[prio] != null && readers[prio].ContainsFile(fileName)) { // This file is already current or queued FL.Checkpoint("This file is already current or queued"); return; } var reader = new FieldLogFileReader(fileName, true); ManualResetEvent h; if (!prioReadSignals.TryGetValue(prio, out h)) { h = new ManualResetEvent(false); prioReadSignals[prio] = h; } reader.ReadWaitHandle = h; if (!readers.ContainsKey(prio) || readers[prio] == null) { // This is the first file of this priority readers[prio] = new FieldLogFileEnumerator(reader); readers[prio].Error += FieldLogFileEnumerator_Error; readTasks[(int)prio] = Task <bool> .Factory.StartNew(readers[prio].MoveNext); // Signal the blocking ReadLogItem method that there's a new reader now newFilePrioEvent.Set(); } else { // Chain the new reader after the last reader in the queue readers[prio].Append(reader, fromFsw); // TODO,DEBUG: What for? //newFilePrioEvent.Set(); } }
/// <summary> /// Reads a log item from the log file. /// </summary> /// <param name="reader">Log file reader.</param> /// <param name="type">The type of log item to read.</param> /// <returns>The read log item.</returns> internal static FieldLogItem Read(FieldLogFileReader reader, FieldLogItemType type) { switch (type) { case FieldLogItemType.Text: return(FieldLogTextItem.Read(reader)); case FieldLogItemType.Data: return(FieldLogDataItem.Read(reader)); case FieldLogItemType.Exception: return(FieldLogExceptionItem.Read(reader)); case FieldLogItemType.Scope: case FieldLogItemType.RepeatedScope: return(FieldLogScopeItem.Read(reader, type == FieldLogItemType.RepeatedScope)); } throw new ArgumentException("Unsupported log item type (" + (int)type + ")"); }
/// <summary> /// Advances the enumerator to the next log item of the currently read log file. If there /// are no more items in this file and there is a NextReader set, the first log item of the /// next file reader is selected. If there are no more items in this file and WaitMode is /// set, the method will block until another log item is appended to the current file or /// the wait operation is cancelled by a close event. /// </summary> /// <returns>true if the enumerator was successfully advanced to the next log item; /// false if the enumerator has passed the end of the collection.</returns> public bool MoveNext() { FieldLogFileReader nextReader = null; do { if (nextReader != null) { FL.Trace(reader.ItemCount + " items read from " + Path.GetFileName(reader.FileName)); reader = nextReader; FL.Trace("Switching to next reader " + Path.GetFileName(reader.FileName)); } try { item = reader.ReadLogItem(); } catch (Exception ex) { FL.Error(ex, "Reading item from log file"); OnError(ex); // Skip the rest of the current file and continue with the next one if // available. If this is the last file and WaitMode is set, this priority will // not be monitored anymore. item = null; } if (item == null && reader.IsClosing) { // Close event must have been set Dispose(); return(false); } nextReader = reader.NextReader; }while (item == null && nextReader != null); return(item != null); }
/// <summary> /// Appends a new FieldLogFileReader at the end of this enumerator. /// </summary> /// <param name="newReader">The new reader to append.</param> /// <param name="fromFsw">Indicates whether the reader was created from a FileSystemWatcher event.</param> public void Append(FieldLogFileReader newReader, bool fromFsw) { FieldLogFileReader currentLastReader = LastReader; currentLastReader.NextReader = newReader; // Unset wait mode for this reader, now that we know where to continue after this file if (fromFsw) { // The file is newly created. Take some time to actually start reading the previous // file before switching to this one. Once the first item has been read from the // file, more items will likely exist in the file, and the file is read until the // end. Then it will still sit there waiting for more items until the rest of this // delay has elapsed (which is not a big problem, if we get any items from that // file at all). #if NET20 new Thread(() => { Thread.Sleep(1000); currentLastReader.WaitMode = false; }).Start(); #else Task.Factory.StartNew(() => { Thread.Sleep(1000); currentLastReader.WaitMode = false; }); #endif } else { currentLastReader.WaitMode = false; } FL.Trace( "Appending next reader", "this=" + Path.GetFileName(currentLastReader.FileName) + "\nNext=" + Path.GetFileName(newReader.FileName) + "\nItems read from this=" + currentLastReader.ItemCount); }
/// <summary> /// Reads the FieldLogWebRequestData data from a log file reader. /// </summary> /// <param name="reader">Log file reader.</param> /// <returns>The web request data.</returns> internal static FieldLogWebRequestData Read(FieldLogFileReader reader) { FieldLogWebRequestData data = new FieldLogWebRequestData(); data.RequestUrl = reader.ReadString(); data.Method = reader.ReadString(); data.ClientAddress = reader.ReadString(); data.ClientHostName = reader.ReadString(); data.Referrer = reader.ReadString(); data.UserAgent = reader.ReadString(); data.AcceptLanguages = reader.ReadString(); data.Accept = reader.ReadString(); data.WebSessionId = reader.ReadString(); data.AppUserId = reader.ReadString(); data.AppUserName = reader.ReadString(); // Check if the environment is actually empty if (string.IsNullOrEmpty(data.RequestUrl)) { return(FieldLogWebRequestData.Empty); } return(data); }
/// <summary> /// Initialises a new instance of the FieldLogFileEnumerator class. /// </summary> /// <param name="reader">The first file reader instance.</param> public FieldLogFileEnumerator(FieldLogFileReader reader) { this.reader = reader; this.firstReader = reader; }
/// <summary> /// Reads the log item fields from the specified log file reader. /// </summary> /// <param name="reader">The log file reader to read from.</param> /// <returns>The read log item.</returns> internal static FieldLogExceptionItem Read(FieldLogFileReader reader) { FieldLogExceptionItem item = new FieldLogExceptionItem(); item.ReadBaseData(reader); item.Exception = FieldLogException.Read(reader); item.Context = reader.ReadString(); item.EnvironmentData = FieldLogEventEnvironment.Read(reader); return item; }
/// <summary> /// Reads a log item from the log file. /// </summary> /// <param name="reader">Log file reader.</param> /// <param name="type">The type of log item to read.</param> /// <returns>The read log item.</returns> internal static FieldLogItem Read(FieldLogFileReader reader, FieldLogItemType type) { switch (type) { case FieldLogItemType.Text: return FieldLogTextItem.Read(reader); case FieldLogItemType.Data: return FieldLogDataItem.Read(reader); case FieldLogItemType.Exception: return FieldLogExceptionItem.Read(reader); case FieldLogItemType.Scope: case FieldLogItemType.RepeatedScope: return FieldLogScopeItem.Read(reader, type == FieldLogItemType.RepeatedScope); } throw new ArgumentException("Unsupported log item type (" + (int)type + ")"); }
/// <summary> /// Reads the log item fields from the specified log file reader. /// </summary> /// <param name="reader">The log file reader to read from.</param> /// <param name="isRepeated">true if the log item is repeated from a previous file, false if it is written for the first time.</param> /// <returns>The read log item.</returns> internal static FieldLogScopeItem Read(FieldLogFileReader reader, bool isRepeated) { FieldLogScopeItem item = new FieldLogScopeItem(); item.ReadBaseData(reader); item.IsRepeated = isRepeated; item.Type = (FieldLogScopeType)reader.ReadByte(); item.Level = reader.ReadInt32(); item.Name = reader.ReadString(); if (item.Type == FieldLogScopeType.ThreadStart) { byte flags = reader.ReadByte(); item.IsBackgroundThread = (flags & 1) != 0; item.IsPoolThread = (flags & 2) != 0; } if (item.Type == FieldLogScopeType.LogStart) { item.EnvironmentData = FieldLogEventEnvironment.Read(reader); } if (item.Type == FieldLogScopeType.WebRequestStart && reader.FormatVersion >= 2) { item.WebRequestData = FieldLogWebRequestData.Read(reader); } return item; }
/// <summary> /// Reads the stack frame fields from the specified log file reader. /// </summary> /// <param name="reader">The log file reader to read from.</param> /// <returns>The stack frame data.</returns> internal static FieldLogStackFrame Read(FieldLogFileReader reader) { FieldLogStackFrame frame = new FieldLogStackFrame(); frame.Module = reader.ReadString(); if (reader.FormatVersion >= 2) { frame.Token = reader.ReadInt32(); frame.ILOffset = reader.ReadInt32(); } frame.TypeName = reader.ReadString(); frame.MethodName = reader.ReadString(); frame.MethodSignature = reader.ReadString(); frame.FileName = reader.ReadString(); frame.Line = reader.ReadInt32(); frame.Column = reader.ReadInt32(); return frame; }
/// <summary> /// Reads the FieldLogEventEnvironment data from a log file reader. /// </summary> /// <param name="reader">Log file reader.</param> /// <returns>The environment data.</returns> internal static FieldLogEventEnvironment Read(FieldLogFileReader reader) { FieldLogEventEnvironment env = new FieldLogEventEnvironment(); env.OSType = (OSType)reader.ReadByte(); env.OSVersion = (OSVersion)reader.ReadByte(); env.OSEdition = (OSEdition)reader.ReadByte(); env.OSServicePack = reader.ReadString(); env.OSBuild = reader.ReadInt32(); env.OSServicePackBuild = reader.ReadInt32(); env.OSProductName = reader.ReadString(); env.OSLanguage = reader.ReadString(); env.OSLastBootTime = new DateTime(reader.ReadInt64(), DateTimeKind.Utc); env.AppCompatLayer = reader.ReadString(); env.ClrType = reader.ReadString(); env.MouseButtons = reader.ReadByte(); env.MaxTouchPoints = reader.ReadByte(); env.ScreenDpi = reader.ReadUInt16(); env.CultureName = reader.ReadString(); env.CurrentDirectory = reader.ReadString(); env.EnvironmentVariables = reader.ReadString(); env.CpuCount = reader.ReadUInt16(); env.HostName = reader.ReadString(); env.UserName = reader.ReadString(); env.ExecutablePath = reader.ReadString(); env.CommandLine = reader.ReadString(); env.AppVersion = reader.ReadString(); if (reader.FormatVersion >= 2) { env.AppAsmConfiguration = reader.ReadString(); } env.ClrVersion = reader.ReadString(); env.LocalTimeZoneOffset = TimeSpan.FromMinutes(reader.ReadInt16()); env.ProcessMemory = reader.ReadInt64(); env.PeakProcessMemory = reader.ReadInt64(); env.TotalMemory = reader.ReadInt64(); env.AvailableMemory = reader.ReadInt64(); env.ProcessId = reader.ReadInt32(); env.PrimaryScreenWidth = reader.ReadUInt16(); env.PrimaryScreenHeight = reader.ReadUInt16(); env.PrimaryScreenBitsPerPixel = reader.ReadByte(); env.PrimaryScreenWorkingAreaLeft = reader.ReadUInt16(); env.PrimaryScreenWorkingAreaTop = reader.ReadUInt16(); env.PrimaryScreenWorkingAreaWidth = reader.ReadUInt16(); env.PrimaryScreenWorkingAreaHeight = reader.ReadUInt16(); env.ScreenCount = reader.ReadByte(); byte flags = reader.ReadByte(); env.OSIs64Bit = (flags & 1) != 0; env.OSIsAppServer = (flags & 2) != 0; env.OSIsFailSafeBoot = (flags & 4) != 0; env.IsInteractive = (flags & 8) != 0; env.IsProcess64Bit = (flags & 16) != 0; env.IsAdministrator = (flags & 32) != 0; // Check if the environment is actually empty if (env.CpuCount == 0) { return(FieldLogEventEnvironment.Empty); } return(env); }
/// <summary> /// Reads the FieldLogEventEnvironment data from a log file reader. /// </summary> /// <param name="reader">Log file reader.</param> /// <returns>The environment data.</returns> internal static FieldLogEventEnvironment Read(FieldLogFileReader reader) { FieldLogEventEnvironment env = new FieldLogEventEnvironment(); env.OSType = (OSType)reader.ReadByte(); env.OSVersion = (OSVersion)reader.ReadByte(); env.OSEdition = (OSEdition)reader.ReadByte(); env.OSServicePack = reader.ReadString(); env.OSBuild = reader.ReadInt32(); env.OSServicePackBuild = reader.ReadInt32(); env.OSProductName = reader.ReadString(); env.OSLanguage = reader.ReadString(); env.OSLastBootTime = new DateTime(reader.ReadInt64(), DateTimeKind.Utc); env.AppCompatLayer = reader.ReadString(); env.ClrType = reader.ReadString(); env.MouseButtons = reader.ReadByte(); env.MaxTouchPoints = reader.ReadByte(); env.ScreenDpi = reader.ReadUInt16(); env.CultureName = reader.ReadString(); env.CurrentDirectory = reader.ReadString(); env.EnvironmentVariables = reader.ReadString(); env.CpuCount = reader.ReadUInt16(); env.HostName = reader.ReadString(); env.UserName = reader.ReadString(); env.ExecutablePath = reader.ReadString(); env.CommandLine = reader.ReadString(); env.AppVersion = reader.ReadString(); if (reader.FormatVersion >= 2) { env.AppAsmConfiguration = reader.ReadString(); } env.ClrVersion = reader.ReadString(); env.LocalTimeZoneOffset = TimeSpan.FromMinutes(reader.ReadInt16()); env.ProcessMemory = reader.ReadInt64(); env.PeakProcessMemory = reader.ReadInt64(); env.TotalMemory = reader.ReadInt64(); env.AvailableMemory = reader.ReadInt64(); env.ProcessId = reader.ReadInt32(); env.PrimaryScreenWidth = reader.ReadUInt16(); env.PrimaryScreenHeight = reader.ReadUInt16(); env.PrimaryScreenBitsPerPixel = reader.ReadByte(); env.PrimaryScreenWorkingAreaLeft = reader.ReadUInt16(); env.PrimaryScreenWorkingAreaTop = reader.ReadUInt16(); env.PrimaryScreenWorkingAreaWidth = reader.ReadUInt16(); env.PrimaryScreenWorkingAreaHeight = reader.ReadUInt16(); env.ScreenCount = reader.ReadByte(); byte flags = reader.ReadByte(); env.OSIs64Bit = (flags & 1) != 0; env.OSIsAppServer = (flags & 2) != 0; env.OSIsFailSafeBoot = (flags & 4) != 0; env.IsInteractive = (flags & 8) != 0; env.IsProcess64Bit = (flags & 16) != 0; env.IsAdministrator = (flags & 32) != 0; // Check if the environment is actually empty if (env.CpuCount == 0) return FieldLogEventEnvironment.Empty; return env; }
/// <summary> /// Reads the exception fields from the specified log file reader. /// </summary> /// <param name="reader">The log file reader to read from.</param> /// <returns>The exception data.</returns> internal static FieldLogException Read(FieldLogFileReader reader) { FieldLogException ex = new FieldLogException(); ex.Type = reader.ReadString(); if (reader.FormatVersion >= 2) { ex.TypeModule = reader.ReadString(); ex.Token = reader.ReadInt32(); } ex.Message = reader.ReadString(); ex.Code = reader.ReadInt32(); ex.Data = reader.ReadString(); int frameCount = reader.ReadInt32(); ex.StackFrames = new FieldLogStackFrame[frameCount]; for (int i = 0; i < frameCount; i++) { ex.StackFrames[i] = FieldLogStackFrame.Read(reader); } int innerCount = reader.ReadInt32(); ex.InnerExceptions = new FieldLogException[innerCount]; for (int i = 0; i < innerCount; i++) { ex.InnerExceptions[i] = FieldLogException.Read(reader); } return ex; }
/// <summary> /// Reads the log item fields from the specified log file reader. /// </summary> /// <param name="reader">The log file reader to read from.</param> /// <returns>The read log item.</returns> internal static FieldLogDataItem Read(FieldLogFileReader reader) { FieldLogDataItem item = new FieldLogDataItem(); item.ReadBaseData(reader); item.Name = reader.ReadString(); item.Value = reader.ReadString(); return item; }
/// <summary> /// Sets the enumerator to its initial position, which is before the first log item of the /// first log file. WARNING: This function is not used yet and may not work as expected. /// It is implemented as part of the IEnumerator interface and probably does not work /// correctly regarding the WaitMode flag because it is re-reading from used readers. /// </summary> public void Reset() { reader = firstReader; reader.Reset(); }
/// <summary> /// Creates a new log file reader and adds it to the priority's log file enumerator. /// </summary> /// <param name="prio">The priority of files to write.</param> /// <param name="fileName">The name of the log file.</param> /// <param name="fromFsw">Indicates whether the reader was created from a FileSystemWatcher event.</param> private void AddNewReader(FieldLogPriority prio, string fileName, bool fromFsw) { // Must be within a lock(readerLock)! FL.Trace("AddNewReader, prio=" + prio + ", fileName=" + Path.GetFileName(fileName) + ", fromFsw=" + fromFsw); // Reject the new file if it's already in the queue (delayed FSW event after active scan) if (readers.ContainsKey(prio) && readers[prio] != null && readers[prio].ContainsFile(fileName)) { // This file is already current or queued FL.Checkpoint("This file is already current or queued"); return; } var reader = new FieldLogFileReader(fileName, true); ManualResetEvent h; if (!prioReadSignals.TryGetValue(prio, out h)) { h = new ManualResetEvent(false); prioReadSignals[prio] = h; } reader.ReadWaitHandle = h; if (!readers.ContainsKey(prio) || readers[prio] == null) { // This is the first file of this priority readers[prio] = new FieldLogFileEnumerator(reader); readers[prio].Error += FieldLogFileEnumerator_Error; readTasks[(int)prio] = Task<bool>.Factory.StartNew(readers[prio].MoveNext); // Signal the blocking ReadLogItem method that there's a new reader now newFilePrioEvent.Set(); } else { // Chain the new reader after the last reader in the queue readers[prio].Append(reader, fromFsw); // TODO,DEBUG: What for? //newFilePrioEvent.Set(); } }
/// <summary> /// Reads the FieldLogWebRequestData data from a log file reader. /// </summary> /// <param name="reader">Log file reader.</param> /// <returns>The web request data.</returns> internal static FieldLogWebRequestData Read(FieldLogFileReader reader) { FieldLogWebRequestData data = new FieldLogWebRequestData(); data.RequestUrl = reader.ReadString(); data.Method = reader.ReadString(); data.ClientAddress = reader.ReadString(); data.ClientHostName = reader.ReadString(); data.Referrer = reader.ReadString(); data.UserAgent = reader.ReadString(); data.AcceptLanguages = reader.ReadString(); data.Accept = reader.ReadString(); data.WebSessionId = reader.ReadString(); data.AppUserId = reader.ReadString(); data.AppUserName = reader.ReadString(); // Check if the environment is actually empty if (string.IsNullOrEmpty(data.RequestUrl)) return FieldLogWebRequestData.Empty; return data; }
/// <summary> /// Reads the log item fields from the specified log file reader. /// </summary> /// <param name="reader">The log file reader to read from.</param> /// <returns>The read log item.</returns> internal static FieldLogTextItem Read(FieldLogFileReader reader) { FieldLogTextItem item = new FieldLogTextItem(); item.ReadBaseData(reader); item.Text = reader.ReadString(); item.Details = reader.ReadString(); return item; }