// Copyright Epic Games, Inc. All Rights Reserved. #include "LogTraceAnalysis.h" #include "AnalysisServicePrivate.h" #include "Common/Utils.h" #include "HAL/LowLevelMemTracker.h" #include "Logging/LogTrace.h" #include "Model/LogPrivate.h" namespace TraceServices { FLogTraceAnalyzer::FLogTraceAnalyzer(IAnalysisSession& InSession, FLogProvider& InLogProvider) : Session(InSession) , LogProvider(InLogProvider) { } void FLogTraceAnalyzer::OnAnalysisBegin(const FOnAnalysisContext& Context) { auto& Builder = Context.InterfaceBuilder; Builder.RouteEvent(RouteId_LogCategory, "Logging", "LogCategory"); Builder.RouteEvent(RouteId_LogMessageSpec, "Logging", "LogMessageSpec"); Builder.RouteEvent(RouteId_LogMessage, "Logging", "LogMessage"); } bool FLogTraceAnalyzer::OnEvent(uint16 RouteId, EStyle Style, const FOnEventContext& Context) { LLM_SCOPE_BYNAME(TEXT("Insights/FLogTraceAnalyzer")); FAnalysisSessionEditScope _(Session); const auto& EventData = Context.EventData; switch (RouteId) { case RouteId_LogCategory: { uint64 CategoryPointer = EventData.GetValue("CategoryPointer"); FLogCategoryInfo& Category = LogProvider.GetCategory(CategoryPointer); FString Name = FTraceAnalyzerUtils::LegacyAttachmentString("Name", Context); Category.Name = Session.StoreString(*Name); Category.DefaultVerbosity = static_cast(EventData.GetValue("DefaultVerbosity")); break; } case RouteId_LogMessageSpec: { uint64 LogPoint = EventData.GetValue("LogPoint"); FLogMessageSpec& Spec = LogProvider.GetMessageSpec(LogPoint); uint64 CategoryPointer = EventData.GetValue("CategoryPointer"); FLogCategoryInfo& Category = LogProvider.GetCategory(CategoryPointer); Spec.Category = &Category; Spec.Line = EventData.GetValue("Line"); Spec.Verbosity = static_cast(EventData.GetValue("Verbosity")); FString FileName; if (EventData.GetString("FileName", FileName)) { Spec.File = Session.StoreString(*FileName); FString FormatString; EventData.GetString("FormatString", FormatString); Spec.FormatString = Session.StoreString(*FormatString); } else { const ANSICHAR* File = reinterpret_cast(EventData.GetAttachment()); Spec.File = Session.StoreString(ANSI_TO_TCHAR(File)); Spec.FormatString = Session.StoreString(reinterpret_cast(EventData.GetAttachment() + strlen(File) + 1)); } break; } case RouteId_LogMessage: { uint64 LogPoint = EventData.GetValue("LogPoint"); uint64 Cycle = EventData.GetValue("Cycle"); TArrayView FormatArgsView = FTraceAnalyzerUtils::LegacyAttachmentArray("FormatArgs", Context); LogProvider.AppendMessage(LogPoint, Context.EventTime.AsSeconds(Cycle), FormatArgsView.GetData()); break; } } return true; } } // namespace TraceServices