Add option to save logfiles seperate for each game (#2504)

* add option to split log

* better naming

* fix

* fix

* fix formatting

* fix misspelling

* make clang conform

* clang fix
This commit is contained in:
Fire Cube 2025-02-23 21:30:11 +01:00 committed by GitHub
parent 84a614dddc
commit c38e1635ea
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 108 additions and 76 deletions

View file

@ -66,6 +66,7 @@ static bool vkHostMarkers = false;
static bool vkGuestMarkers = false; static bool vkGuestMarkers = false;
static bool rdocEnable = false; static bool rdocEnable = false;
static bool isFpsColor = true; static bool isFpsColor = true;
static bool isSeparateLogFilesEnabled = false;
static s16 cursorState = HideCursorState::Idle; static s16 cursorState = HideCursorState::Idle;
static int cursorHideTimeout = 5; // 5 seconds (default) static int cursorHideTimeout = 5; // 5 seconds (default)
static bool useUnifiedInputConfig = true; static bool useUnifiedInputConfig = true;
@ -451,6 +452,10 @@ void setLogFilter(const std::string& type) {
logFilter = type; logFilter = type;
} }
void setSeparateLogFilesEnabled(bool enabled) {
isSeparateLogFilesEnabled = enabled;
}
void setUserName(const std::string& type) { void setUserName(const std::string& type) {
userName = type; userName = type;
} }
@ -656,6 +661,10 @@ u32 GetLanguage() {
return m_language; return m_language;
} }
bool getSeparateLogFilesEnabled() {
return isSeparateLogFilesEnabled;
}
int getBackgroundImageOpacity() { int getBackgroundImageOpacity() {
return backgroundImageOpacity; return backgroundImageOpacity;
} }
@ -761,6 +770,7 @@ void load(const std::filesystem::path& path) {
const toml::value& debug = data.at("Debug"); const toml::value& debug = data.at("Debug");
isDebugDump = toml::find_or<bool>(debug, "DebugDump", false); isDebugDump = toml::find_or<bool>(debug, "DebugDump", false);
isSeparateLogFilesEnabled = toml::find_or<bool>(debug, "isSeparateLogFilesEnabled", false);
isShaderDebug = toml::find_or<bool>(debug, "CollectShader", false); isShaderDebug = toml::find_or<bool>(debug, "CollectShader", false);
isFpsColor = toml::find_or<bool>(debug, "FPSColor", true); isFpsColor = toml::find_or<bool>(debug, "FPSColor", true);
} }
@ -887,6 +897,7 @@ void save(const std::filesystem::path& path) {
data["Vulkan"]["rdocEnable"] = rdocEnable; data["Vulkan"]["rdocEnable"] = rdocEnable;
data["Debug"]["DebugDump"] = isDebugDump; data["Debug"]["DebugDump"] = isDebugDump;
data["Debug"]["CollectShader"] = isShaderDebug; data["Debug"]["CollectShader"] = isShaderDebug;
data["Debug"]["isSeparateLogFilesEnabled"] = isSeparateLogFilesEnabled;
data["Debug"]["FPSColor"] = isFpsColor; data["Debug"]["FPSColor"] = isFpsColor;
data["Keys"]["TrophyKey"] = trophyKey; data["Keys"]["TrophyKey"] = trophyKey;

View file

@ -111,7 +111,8 @@ void setIsMotionControlsEnabled(bool use);
void setLogType(const std::string& type); void setLogType(const std::string& type);
void setLogFilter(const std::string& type); void setLogFilter(const std::string& type);
void setSeparateLogFilesEnabled(bool enabled);
bool getSeparateLogFilesEnabled();
void setVkValidation(bool enable); void setVkValidation(bool enable);
void setVkSyncValidation(bool enable); void setVkSyncValidation(bool enable);
void setRdocEnabled(bool enable); void setRdocEnabled(bool enable);

View file

@ -139,8 +139,9 @@ public:
std::filesystem::create_directory(log_dir); std::filesystem::create_directory(log_dir);
Filter filter; Filter filter;
filter.ParseFilterString(Config::getLogFilter()); filter.ParseFilterString(Config::getLogFilter());
instance = std::unique_ptr<Impl, decltype(&Deleter)>(new Impl(log_dir / LOG_FILE, filter), const auto& log_file_path = log_file.empty() ? LOG_FILE : log_file;
Deleter); instance = std::unique_ptr<Impl, decltype(&Deleter)>(
new Impl(log_dir / log_file_path, filter), Deleter);
initialization_in_progress_suppress_logging = false; initialization_in_progress_suppress_logging = false;
} }

View file

@ -50,29 +50,6 @@ Emulator::Emulator() {
SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS); SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);
#endif #endif
// Start logger.
Common::Log::Initialize();
Common::Log::Start();
LOG_INFO(Loader, "Starting shadps4 emulator v{} ", Common::VERSION);
LOG_INFO(Loader, "Revision {}", Common::g_scm_rev);
LOG_INFO(Loader, "Branch {}", Common::g_scm_branch);
LOG_INFO(Loader, "Description {}", Common::g_scm_desc);
LOG_INFO(Loader, "Remote {}", Common::g_scm_remote_url);
LOG_INFO(Config, "General LogType: {}", Config::getLogType());
LOG_INFO(Config, "General isNeo: {}", Config::isNeoModeConsole());
LOG_INFO(Config, "GPU isNullGpu: {}", Config::nullGpu());
LOG_INFO(Config, "GPU shouldDumpShaders: {}", Config::dumpShaders());
LOG_INFO(Config, "GPU vblankDivider: {}", Config::vblankDiv());
LOG_INFO(Config, "Vulkan gpuId: {}", Config::getGpuId());
LOG_INFO(Config, "Vulkan vkValidation: {}", Config::vkValidationEnabled());
LOG_INFO(Config, "Vulkan vkValidationSync: {}", Config::vkValidationSyncEnabled());
LOG_INFO(Config, "Vulkan vkValidationGpu: {}", Config::vkValidationGpuEnabled());
LOG_INFO(Config, "Vulkan crashDiagnostics: {}", Config::getVkCrashDiagnosticEnabled());
LOG_INFO(Config, "Vulkan hostMarkers: {}", Config::getVkHostMarkersEnabled());
LOG_INFO(Config, "Vulkan guestMarkers: {}", Config::getVkGuestMarkersEnabled());
LOG_INFO(Config, "Vulkan rdocEnable: {}", Config::isRdocEnabled());
// Create stdin/stdout/stderr // Create stdin/stdout/stderr
Common::Singleton<FileSys::HandleTable>::Instance()->CreateStdHandles(); Common::Singleton<FileSys::HandleTable>::Instance()->CreateStdHandles();
@ -90,9 +67,8 @@ Emulator::Emulator() {
const auto user_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); const auto user_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir);
QString filePath = QString::fromStdString((user_dir / "play_time.txt").string()); QString filePath = QString::fromStdString((user_dir / "play_time.txt").string());
QFile file(filePath); QFile file(filePath);
if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) { ASSERT_MSG(file.open(QIODevice::ReadWrite | QIODevice::Text),
LOG_INFO(Loader, "Error opening or creating play_time.txt"); "Error opening or creating play_time.txt");
}
#endif #endif
} }
@ -138,6 +114,34 @@ void Emulator::Run(const std::filesystem::path& file, const std::vector<std::str
const auto content_id = param_sfo->GetString("CONTENT_ID"); const auto content_id = param_sfo->GetString("CONTENT_ID");
ASSERT_MSG(content_id.has_value(), "Failed to get CONTENT_ID"); ASSERT_MSG(content_id.has_value(), "Failed to get CONTENT_ID");
id = std::string(*content_id, 7, 9); id = std::string(*content_id, 7, 9);
if (Config::getSeparateLogFilesEnabled()) {
Common::Log::Initialize(id + ".log");
}
else {
Common::Log::Initialize();
}
Common::Log::Start();
LOG_INFO(Loader, "Starting shadps4 emulator v{} ", Common::VERSION);
LOG_INFO(Loader, "Revision {}", Common::g_scm_rev);
LOG_INFO(Loader, "Branch {}", Common::g_scm_branch);
LOG_INFO(Loader, "Description {}", Common::g_scm_desc);
LOG_INFO(Loader, "Remote {}", Common::g_scm_remote_url);
LOG_INFO(Config, "General LogType: {}", Config::getLogType());
LOG_INFO(Config, "General isNeo: {}", Config::isNeoModeConsole());
LOG_INFO(Config, "GPU isNullGpu: {}", Config::nullGpu());
LOG_INFO(Config, "GPU shouldDumpShaders: {}", Config::dumpShaders());
LOG_INFO(Config, "GPU vblankDivider: {}", Config::vblankDiv());
LOG_INFO(Config, "Vulkan gpuId: {}", Config::getGpuId());
LOG_INFO(Config, "Vulkan vkValidation: {}", Config::vkValidationEnabled());
LOG_INFO(Config, "Vulkan vkValidationSync: {}", Config::vkValidationSyncEnabled());
LOG_INFO(Config, "Vulkan vkValidationGpu: {}", Config::vkValidationGpuEnabled());
LOG_INFO(Config, "Vulkan crashDiagnostics: {}", Config::getVkCrashDiagnosticEnabled());
LOG_INFO(Config, "Vulkan hostMarkers: {}", Config::getVkHostMarkersEnabled());
LOG_INFO(Config, "Vulkan guestMarkers: {}", Config::getVkGuestMarkersEnabled());
LOG_INFO(Config, "Vulkan rdocEnable: {}", Config::isRdocEnabled());
Libraries::NpTrophy::game_serial = id; Libraries::NpTrophy::game_serial = id;
const auto trophyDir = const auto trophyDir =
Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / id / "TrophyFiles"; Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / id / "TrophyFiles";

View file

@ -425,6 +425,8 @@ void SettingsDialog::LoadValuesFromConfig() {
QString::fromStdString(toml::find_or<std::string>(data, "Keys", "TrophyKey", ""))); QString::fromStdString(toml::find_or<std::string>(data, "Keys", "TrophyKey", "")));
ui->trophyKeyLineEdit->setEchoMode(QLineEdit::Password); ui->trophyKeyLineEdit->setEchoMode(QLineEdit::Password);
ui->debugDump->setChecked(toml::find_or<bool>(data, "Debug", "DebugDump", false)); ui->debugDump->setChecked(toml::find_or<bool>(data, "Debug", "DebugDump", false));
ui->separateLogFilesCheckbox->setChecked(
toml::find_or<bool>(data, "Debug", "isSeparateLogFilesEnabled", false));
ui->vkValidationCheckBox->setChecked(toml::find_or<bool>(data, "Vulkan", "validation", false)); ui->vkValidationCheckBox->setChecked(toml::find_or<bool>(data, "Vulkan", "validation", false));
ui->vkSyncValidationCheckBox->setChecked( ui->vkSyncValidationCheckBox->setChecked(
toml::find_or<bool>(data, "Vulkan", "validation_sync", false)); toml::find_or<bool>(data, "Vulkan", "validation_sync", false));
@ -648,7 +650,8 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) {
text = tr("Copy GPU Buffers:\\nGets around race conditions involving GPU submits.\\nMay or may not help with PM4 type 0 crashes."); text = tr("Copy GPU Buffers:\\nGets around race conditions involving GPU submits.\\nMay or may not help with PM4 type 0 crashes.");
} else if (elementName == "collectShaderCheckBox") { } else if (elementName == "collectShaderCheckBox") {
text = tr("Collect Shaders:\\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10)."); text = tr("Collect Shaders:\\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10).");
} } else if (elementName == "separateLogFilesCheckbox") {
text = tr("Separate Log Files:\\nWrites a separate logfile for each game.");}
// clang-format on // clang-format on
ui->descriptionText->setText(text.replace("\\n", "\n")); ui->descriptionText->setText(text.replace("\\n", "\n"));
} }
@ -700,6 +703,7 @@ void SettingsDialog::UpdateSettings() {
Config::setLoadGameSizeEnabled(ui->gameSizeCheckBox->isChecked()); Config::setLoadGameSizeEnabled(ui->gameSizeCheckBox->isChecked());
Config::setShowSplash(ui->showSplashCheckBox->isChecked()); Config::setShowSplash(ui->showSplashCheckBox->isChecked());
Config::setDebugDump(ui->debugDump->isChecked()); Config::setDebugDump(ui->debugDump->isChecked());
Config::setSeparateLogFilesEnabled(ui->separateLogFilesCheckbox->isChecked());
Config::setVkValidation(ui->vkValidationCheckBox->isChecked()); Config::setVkValidation(ui->vkValidationCheckBox->isChecked());
Config::setVkSyncValidation(ui->vkSyncValidationCheckBox->isChecked()); Config::setVkSyncValidation(ui->vkSyncValidationCheckBox->isChecked());
Config::setRdocEnabled(ui->rdocCheckBox->isChecked()); Config::setRdocEnabled(ui->rdocCheckBox->isChecked());

View file

@ -59,7 +59,7 @@
</size> </size>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>0</number> <number>6</number>
</property> </property>
<widget class="QScrollArea" name="generalTab"> <widget class="QScrollArea" name="generalTab">
<property name="widgetResizable"> <property name="widgetResizable">
@ -73,8 +73,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>946</width> <width>718</width>
<height>536</height> <height>332</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="generalTabVLayout" stretch="0"> <layout class="QVBoxLayout" name="generalTabVLayout" stretch="0">
@ -454,8 +454,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>946</width> <width>646</width>
<height>536</height> <height>395</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="guiTabVLayout" stretch="0"> <layout class="QVBoxLayout" name="guiTabVLayout" stretch="0">
@ -903,8 +903,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>946</width> <width>545</width>
<height>536</height> <height>141</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="graphicsTabVLayout" stretch="0,0"> <layout class="QVBoxLayout" name="graphicsTabVLayout" stretch="0,0">
@ -1198,8 +1198,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>946</width> <width>234</width>
<height>536</height> <height>292</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="userTabVLayout" stretch="0,0,1"> <layout class="QVBoxLayout" name="userTabVLayout" stretch="0,0,1">
@ -1342,8 +1342,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>946</width> <width>455</width>
<height>536</height> <height>252</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="inputTabVLayout" stretch="0,0"> <layout class="QVBoxLayout" name="inputTabVLayout" stretch="0,0">
@ -1626,8 +1626,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>946</width> <width>216</width>
<height>536</height> <height>254</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="pathsTabLayout"> <layout class="QVBoxLayout" name="pathsTabLayout">
@ -1888,39 +1888,50 @@
</property> </property>
<layout class="QVBoxLayout" name="advancedLayout"> <layout class="QVBoxLayout" name="advancedLayout">
<item> <item>
<widget class="QCheckBox" name="crashDiagnosticsCheckBox"> <layout class="QFormLayout" name="formLayout">
<property name="text"> <item row="0" column="0">
<string>Enable Crash Diagnostics</string> <widget class="QCheckBox" name="collectShaderCheckBox">
</property> <property name="text">
</widget> <string>Collect Shaders</string>
</item> </property>
<item> </widget>
<widget class="QCheckBox" name="collectShaderCheckBox"> </item>
<property name="text"> <item row="2" column="0">
<string>Collect Shaders</string> <widget class="QCheckBox" name="copyGPUBuffersCheckBox">
</property> <property name="text">
</widget> <string>Copy GPU Buffers</string>
</item> </property>
<item> </widget>
<widget class="QCheckBox" name="copyGPUBuffersCheckBox"> </item>
<property name="text"> <item row="1" column="0">
<string>Copy GPU Buffers</string> <widget class="QCheckBox" name="crashDiagnosticsCheckBox">
</property> <property name="text">
</widget> <string>Enable Crash Diagnostics</string>
</item> </property>
<item> </widget>
<widget class="QCheckBox" name="hostMarkersCheckBox"> </item>
<property name="text"> <item row="3" column="0">
<string>Host Debug Markers</string> <widget class="QCheckBox" name="hostMarkersCheckBox">
</property> <property name="text">
</widget> <string>Host Debug Markers</string>
</item> </property>
<item> </widget>
<widget class="QCheckBox" name="guestMarkersCheckBox"> </item>
<property name="text"> <item row="4" column="0">
<string>Guest Debug Markers</string> <widget class="QCheckBox" name="guestMarkersCheckBox">
</property> <property name="text">
</widget> <string>Guest Debug Markers</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="separateLogFilesCheckbox">
<property name="text">
<string>Separate Log Files</string>
</property>
</widget>
</item>
</layout>
</item> </item>
</layout> </layout>
</widget> </widget>