From 65229026bb5918198c7257d62f26ecd31b4ac619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 May 2025 18:54:30 +0200 Subject: [PATCH] Add a checkbox to enable file logging from the UI, in developer settings. Fixes issue #20372. The file is written to PSP/SYSTEM/DUMP/log.txt by default, but you can override from the command line if needed. --- Common/Log/LogManager.cpp | 4 ++-- Common/Log/LogManager.h | 10 +++++++++- Core/Config.cpp | 3 ++- Core/Config.h | 2 ++ Core/System.cpp | 13 +++++++++++++ Tools/langtool/Cargo.lock | 12 ++++++------ UI/DeveloperToolsScreen.cpp | 1 + UI/NativeApp.cpp | 8 ++++++-- UWP/PPSSPP_UWPMain.cpp | 2 +- assets/lang/ar_AE.ini | 1 + assets/lang/az_AZ.ini | 1 + assets/lang/be_BY.ini | 1 + assets/lang/bg_BG.ini | 1 + assets/lang/ca_ES.ini | 1 + assets/lang/cz_CZ.ini | 1 + assets/lang/da_DK.ini | 1 + assets/lang/de_DE.ini | 1 + assets/lang/dr_ID.ini | 1 + assets/lang/en_US.ini | 1 + assets/lang/es_ES.ini | 1 + assets/lang/es_LA.ini | 1 + assets/lang/fa_IR.ini | 1 + assets/lang/fi_FI.ini | 1 + assets/lang/fr_FR.ini | 1 + assets/lang/gl_ES.ini | 1 + assets/lang/gr_EL.ini | 1 + assets/lang/he_IL.ini | 1 + assets/lang/he_IL_invert.ini | 1 + assets/lang/hr_HR.ini | 1 + assets/lang/hu_HU.ini | 1 + assets/lang/id_ID.ini | 1 + assets/lang/it_IT.ini | 1 + assets/lang/ja_JP.ini | 1 + assets/lang/jv_ID.ini | 1 + assets/lang/ko_KR.ini | 1 + assets/lang/ku_SO.ini | 1 + assets/lang/lo_LA.ini | 1 + assets/lang/lt-LT.ini | 1 + assets/lang/ms_MY.ini | 1 + assets/lang/nl_NL.ini | 1 + assets/lang/no_NO.ini | 1 + assets/lang/pl_PL.ini | 1 + assets/lang/pt_BR.ini | 1 + assets/lang/pt_PT.ini | 1 + assets/lang/ro_RO.ini | 1 + assets/lang/ru_RU.ini | 1 + assets/lang/sv_SE.ini | 1 + assets/lang/tg_PH.ini | 1 + assets/lang/th_TH.ini | 1 + assets/lang/tr_TR.ini | 1 + assets/lang/uk_UA.ini | 1 + assets/lang/vi_VN.ini | 1 + assets/lang/zh_CN.ini | 1 + assets/lang/zh_TW.ini | 1 + 54 files changed, 87 insertions(+), 13 deletions(-) diff --git a/Common/Log/LogManager.cpp b/Common/Log/LogManager.cpp index 959ac264c3..d84f47c2b2 100644 --- a/Common/Log/LogManager.cpp +++ b/Common/Log/LogManager.cpp @@ -194,7 +194,7 @@ LogManager::~LogManager() { #endif } -void LogManager::ChangeFileLog(const Path &filename) { +void LogManager::SetFileLogPath(const Path &filename) { if (fp_ && filename == logFilename_) { // All good return; @@ -235,7 +235,7 @@ void LogManager::LoadConfig(const Section *section, bool debugDefaults) { void LogManager::SetOutputsEnabled(LogOutput outputs) { outputs_ = outputs; if (outputs & LogOutput::File) { - ChangeFileLog(logFilename_); + SetFileLogPath(logFilename_); } } diff --git a/Common/Log/LogManager.h b/Common/Log/LogManager.h index 21ea872da8..b522daf587 100644 --- a/Common/Log/LogManager.h +++ b/Common/Log/LogManager.h @@ -95,6 +95,13 @@ public: temp &= ~output; SetOutputsEnabled(temp); } + void EnableOutput(LogOutput output, bool enabled) { + if (enabled) { + EnableOutput(output); + } else { + DisableOutput(output); + } + } static u32 GetMaxLevel() { return (u32)MAX_LOGLEVEL; } static int GetNumChannels() { return (int)Log::NUMBER_OF_LOGS; } @@ -142,7 +149,8 @@ public: externalUserData_ = userdata; } - void ChangeFileLog(const Path &filename); + void SetFileLogPath(const Path &filename); + const Path &GetLogFilePath() const { return logFilename_; } void SaveConfig(Section *section); void LoadConfig(const Section *section, bool debugDefaults); diff --git a/Core/Config.cpp b/Core/Config.cpp index e0a917c032..6b8c868d17 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -217,7 +217,8 @@ static float DefaultUISaturation() { static const ConfigSetting generalSettings[] = { ConfigSetting("FirstRun", &g_Config.bFirstRun, true, CfgFlag::DEFAULT), ConfigSetting("RunCount", &g_Config.iRunCount, 0, CfgFlag::DEFAULT), - ConfigSetting("Enable Logging", &g_Config.bEnableLogging, true, CfgFlag::DEFAULT), + ConfigSetting("Enable Logging", &g_Config.bEnableLogging, true, CfgFlag::PER_GAME), + ConfigSetting("FileLogging", &g_Config.bEnableFileLogging, false, CfgFlag::PER_GAME), ConfigSetting("AutoRun", &g_Config.bAutoRun, true, CfgFlag::DEFAULT), ConfigSetting("Browse", &g_Config.bBrowse, false, CfgFlag::DEFAULT), ConfigSetting("IgnoreBadMemAccess", &g_Config.bIgnoreBadMemAccess, true, CfgFlag::DEFAULT), diff --git a/Core/Config.h b/Core/Config.h index 428f00b7dc..b49a968302 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -85,6 +85,8 @@ public: bool bDumpAudio; bool bSaveLoadResetsAVdumping; bool bEnableLogging; + bool bEnableFileLogging; + int iLogOutputTypes; // enum class LogOutput int iDumpFileTypes; // DumpFileType bitflag enum bool bFullscreenOnDoubleclick; diff --git a/Core/System.cpp b/Core/System.cpp index 41d00f0738..becec1408f 100644 --- a/Core/System.cpp +++ b/Core/System.cpp @@ -39,6 +39,7 @@ #include "Common/File/FileUtil.h" #include "Common/File/DirListing.h" #include "Common/File/AndroidContentURI.h" +#include "Common/Log/LogManager.h" #include "Common/TimeUtil.h" #include "Common/Thread/ThreadUtil.h" #include "Common/GraphicsContext.h" @@ -93,6 +94,7 @@ static volatile CPUThreadState cpuThreadState = CPU_THREAD_NOT_RUNNING; static GPUBackend gpuBackend; static std::string gpuBackendDevice; +static bool g_fileLoggingWasEnabled; static BootState g_bootState = BootState::Off; @@ -373,6 +375,15 @@ static bool CPU_Init(FileLoader *fileLoader, IdentifiedFileType type, std::strin return false; } + // If it was forced on the command line. We don't want to override that. + g_fileLoggingWasEnabled = g_logManager.GetOutputsEnabled() & LogOutput::File; + g_logManager.EnableOutput(LogOutput::File, g_Config.bEnableFileLogging || g_fileLoggingWasEnabled); + + if ((g_logManager.GetOutputsEnabled() & LogOutput::File) && !g_logManager.GetLogFilePath().empty()) { + auto dev = GetI18NCategory(I18NCat::DEVELOPER); + g_OSD.Show(OSDType::MESSAGE_INFO, ApplySafeSubstitutions("%1: %2", dev->T("Log to file"), g_logManager.GetLogFilePath().ToVisualString())); + } + InitVFPU(); LoadSymbolsIfSupported(); @@ -482,6 +493,8 @@ void CPU_Shutdown(bool success) { g_symbolMap = nullptr; g_lua.Shutdown(); + + g_logManager.EnableOutput(LogOutput::File, g_fileLoggingWasEnabled); } // Used for UMD switching only. diff --git a/Tools/langtool/Cargo.lock b/Tools/langtool/Cargo.lock index bc945663d8..4073e0c1b0 100644 --- a/Tools/langtool/Cargo.lock +++ b/Tools/langtool/Cargo.lock @@ -43,12 +43,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" dependencies = [ "anstyle", - "once_cell", + "once_cell_polyfill", "windows-sys", ] @@ -118,10 +118,10 @@ dependencies = [ ] [[package]] -name = "once_cell" -version = "1.21.3" +name = "once_cell_polyfill" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" [[package]] name = "proc-macro2" diff --git a/UI/DeveloperToolsScreen.cpp b/UI/DeveloperToolsScreen.cpp index 8500475f9e..9c3e058d16 100644 --- a/UI/DeveloperToolsScreen.cpp +++ b/UI/DeveloperToolsScreen.cpp @@ -157,6 +157,7 @@ void DeveloperToolsScreen::CreateGeneralTab(UI::LinearLayout *list) { list->Add(new ItemHeader(sy->T("General"))); list->Add(new CheckBox(&g_Config.bEnableLogging, dev->T("Enable Logging")))->OnClick.Handle(this, &DeveloperToolsScreen::OnLoggingChanged); + list->Add(new CheckBox(&g_Config.bEnableFileLogging, dev->T("Log to file")))->SetEnabledPtr(&g_Config.bEnableLogging); list->Add(new Choice(dev->T("Logging Channels")))->OnClick.Handle(this, &DeveloperToolsScreen::OnLogConfig); list->Add(new CheckBox(&g_Config.bLogFrameDrops, dev->T("Log Dropped Frame Statistics"))); if (GetGPUBackend() == GPUBackend::VULKAN) { diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index f41237a9de..7c56a383df 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -664,11 +664,15 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch if (fileToLog) { g_logManager.EnableOutput(LogOutput::File); - g_logManager.ChangeFileLog(Path(fileToLog)); + g_logManager.SetFileLogPath(Path(fileToLog)); + } else { + // Set a default file logging path, in case the user enables it with the checkbox later. + g_logManager.SetFileLogPath(GetSysDirectory(DIRECTORY_DUMP) / "log.txt"); } - if (forceLogLevel) + if (forceLogLevel) { g_logManager.SetAllLogLevels(logLevel); + } PostLoadConfig(); diff --git a/UWP/PPSSPP_UWPMain.cpp b/UWP/PPSSPP_UWPMain.cpp index 1d64d77631..d6f99f3026 100644 --- a/UWP/PPSSPP_UWPMain.cpp +++ b/UWP/PPSSPP_UWPMain.cpp @@ -75,7 +75,7 @@ PPSSPP_UWPMain::PPSSPP_UWPMain(App ^app, const std::shared_ptr