in src/Microsoft.VisualStudio.Extensibility.Testing.Xunit.Shared/Harness/EventLogCollector.cs [123:189]
internal static void TryWriteWatsonEntriesToFile(string filePath)
{
try
{
// Use a HashSet to make sure the entries we add aren't duplicates (calls the Equals override from FeedbackItemWatsonEntry)
var watsonEntries = new HashSet<FeedbackItemWatsonEntry>();
// We need to search in the Application Event Log, since that's where Watson logs entries
var eventLogQuery = new EventLogQuery(EventLogName, PathType.LogName)
{
// Read events in descending order, so we can get either the last 5 entries or the past day of entries, whichever has a bigger count
ReverseDirection = true,
};
var eventLogReader = new EventLogReader(eventLogQuery);
EventRecord eventLogRecord;
var watsonEntriesCount = 0;
while ((eventLogRecord = eventLogReader.ReadEvent()) != null)
{
// We only want the last 5 entries or the past day of entries, whichever has a bigger count
if (IsLastDayOrLastFiveRecentEntry(eventLogRecord, watsonEntriesCount))
{
// Filter the entries by Watson specific ones for VS EXEs
if (IsValidWatsonEntry(eventLogRecord))
{
var entry = new FeedbackItemWatsonEntry(eventLogRecord);
watsonEntries.Add(entry);
// If the entry doesn't have a valid BucketId, we don't want it to count towards the maxCount we send
if (!string.IsNullOrWhiteSpace(GetEventRecordPropertyToString(eventLogRecord, FaultBucketIndex)))
{
watsonEntriesCount++;
}
}
}
else
{
break;
}
}
if (watsonEntries.Any())
{
var watsonEntriesStringBuilder = new StringBuilder();
foreach (var entry in watsonEntries)
{
watsonEntriesStringBuilder.AppendLine($"Event Time (UTC): {entry.EventTime}");
watsonEntriesStringBuilder.AppendLine($"Application Name: {entry.ApplicationName}");
watsonEntriesStringBuilder.AppendLine($"Application Version: {entry.ApplicationVersion}");
watsonEntriesStringBuilder.AppendLine($"Faulting Module: {entry.FaultingModule}");
watsonEntriesStringBuilder.AppendLine($"Faulting Module Version: {entry.FaultingModuleVersion}");
watsonEntriesStringBuilder.AppendLine($"Event Name: {entry.EventName}");
watsonEntriesStringBuilder.AppendLine($"Cab Id: {entry.CabId}");
watsonEntriesStringBuilder.AppendLine($"Fault Bucket: {entry.FaultBucket}");
watsonEntriesStringBuilder.AppendLine($"Hashed Bucket: {entry.HashedBucket}");
watsonEntriesStringBuilder.AppendLine($"Watson Report Id: {entry.WatsonReportId}");
watsonEntriesStringBuilder.AppendLine();
}
File.WriteAllText(filePath, watsonEntriesStringBuilder.ToString());
}
}
catch (Exception ex)
{
File.WriteAllText(filePath, ex.ToString());
}
}