void LogMessages(Settings settings) { LogSources sources(true); sources.AddDBWinReader(false); if (HasGlobalDBWinReaderRights()) sources.AddDBWinReader(true); sources.SetAutoNewLine(settings.autonewline); std::ofstream fs; if (!settings.filename.empty()) { OpenLogFile(fs, WStr(settings.filename)); fs.flush(); } auto guard = make_guard([&fs, &settings]() { if (!settings.filename.empty()) { fs.flush(); fs.close(); std::cout << "Log file closed.\n"; } }); std::string separator = settings.tabs ? "\t" : " "; while (!g_quit) { auto lines = sources.GetLines(); int linenumber = 0; for (auto it = lines.begin(); it != lines.end(); ++it) { if (settings.console) { if (settings.linenumber) { ++linenumber; std::cout << std::setw(5) << std::setfill('0') << linenumber << std::setfill(' ') << separator; } OutputDetails(settings, *it); std::cout << separator << it->message.c_str() << "\n"; } if (!settings.filename.empty()) { WriteLogFileMessage(fs, it->time, it->systemTime, it->pid, it->processName, it->message); } } if (settings.flush) { std::cout.flush(); fs.flush(); } Sleep(250); } std::cout.flush(); }
void GenerateOutput(UWorld* InWorld, int32 Depth, bool bShowDefault, bool bShowScript) { auto PrintLogTimes = GPrintLogTimes; // Create log file const FString PathName = *(FPaths::GameLogDir() + TEXT("RefInfo/")); IFileManager::Get().MakeDirectory(*PathName); const FString Filename = FString::Printf(TEXT("Output-%s.txt"), *FDateTime::Now().ToString(TEXT("%m.%d-%H.%M.%S"))); const FString FilenameFull = PathName + Filename; FOutputDeviceFile FileAr(*FilenameFull); FileAr.SetSuppressEventTag(true); GPrintLogTimes = ELogTimes::None; // Set up our ignore lists IgnoreClasses.Empty(); IgnorePackages.Empty(); IgnoreClasses.Add(ULevel::StaticClass()); IgnoreClasses.Add(UWorld::StaticClass()); // Load the asset registry module FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry")); TArray<FAssetData> AssetData; FARFilter Filter; Filter.PackagePaths.Add(FName(TEXT("/Engine/EngineResources"))); Filter.PackagePaths.Add(FName(TEXT("/Engine/EngineFonts"))); Filter.PackagePaths.Add(FName(TEXT("/Engine/EngineMaterials"))); Filter.PackagePaths.Add(FName(TEXT("/Engine/EditorResources"))); Filter.PackagePaths.Add(FName(TEXT("/Engine/EditorMaterials"))); AssetRegistryModule.Get().GetAssets(Filter, AssetData); for (int32 AssetIdx = 0; AssetIdx < AssetData.Num(); ++AssetIdx) { IgnorePackages.Add(FindObject<UPackage>(NULL, *AssetData[AssetIdx].PackageName.ToString(), true)); } IgnorePackages.Add(GetTransientPackage()); // Bug? At this point IgnorePackages often has a handful of null entries, which, completely throws off the filtering process IgnorePackages.Remove(NULL); // Generate reference info BuildAssetList(InWorld, Depth, bShowDefault, bShowScript); // Output reference info OutputTree(FileAr); OutputDetails(FileAr); FileAr.TearDown(); GPrintLogTimes = PrintLogTimes; // Display "completed" popup FString AbsPath = FilenameFull; FPaths::ConvertRelativePathToFull(AbsPath); FFormatNamedArguments Args; Args.Add( TEXT("AbsolutePath"), FText::FromString( AbsPath ) ); FNotificationInfo Info( FText::Format( NSLOCTEXT("UnrealEd", "ReferenceInfoSavedNotification", "Reference info was successfully saved to: {AbsolutePath}"), Args ) ); Info.ExpireDuration = 3.0f; FSlateNotificationManager::Get().AddNotification(Info); }