diff options
| author | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-03-05 15:23:27 -0600 |
|---|---|---|
| committer | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-03-05 15:23:27 -0600 |
| commit | c11849c524c05d1b779d10bb5acf01a3506a0d39 (patch) | |
| tree | 0d37c428d07f56c306649900e7833ee0211b8cef /src | |
| parent | 0aba9526f0f2e0f372d4ceadff80fd8ed3037358 (diff) | |
Use direct stderr for VFS timing logs and filter Wine/Proton noise
- Switch VFS timing logs from log::info() to fprintf(stderr) so they
always appear in terminal regardless of configured log level
- Filter noisy Wine/Proton stderr output (GStreamer warnings,
ProtonFixes info, RADV conformance, MangoHud, NTSync messages)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/src/fuseconnector.cpp | 32 | ||||
| -rw-r--r-- | src/src/organizercore.cpp | 4 | ||||
| -rw-r--r-- | src/src/protonlauncher.cpp | 19 |
3 files changed, 39 insertions, 16 deletions
diff --git a/src/src/fuseconnector.cpp b/src/src/fuseconnector.cpp index f466b04..ab52687 100644 --- a/src/src/fuseconnector.cpp +++ b/src/src/fuseconnector.cpp @@ -17,6 +17,7 @@ #include <algorithm> #include <chrono> #include <cerrno> +#include <cstdio> #include <cstring> #include <fcntl.h> #include <filesystem> @@ -234,9 +235,9 @@ bool FuseConnector::mount( } const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::steady_clock::now() - t0).count(); - log::info("VFS: scanned {} base game entries in {}ms ({})", - m_baseFileCache.size(), ms, - m_dataDirPath == m_cachedDataDirPath ? "cached" : "fresh"); + std::fprintf(stderr, "[VFS] scanned %zu base game entries in %lldms (%s)\n", + m_baseFileCache.size(), static_cast<long long>(ms), + m_dataDirPath == m_cachedDataDirPath ? "cached" : "fresh"); } // Open fd to data dir BEFORE mounting so we can access original files @@ -257,8 +258,8 @@ bool FuseConnector::mount( { const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::steady_clock::now() - treeStart).count(); - log::info("VFS: built tree ({} files, {} dirs) in {}ms", - tree->file_count, tree->dir_count, ms); + std::fprintf(stderr, "[VFS] built tree (%zu files, %zu dirs) in %lldms\n", + tree->file_count, tree->dir_count, static_cast<long long>(ms)); } m_context = std::make_shared<Mo2FsContext>(); @@ -313,8 +314,8 @@ bool FuseConnector::mount( { const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::steady_clock::now() - mountStart).count(); - log::info("VFS: mounted on '{}' in {}ms total", - QString::fromStdString(m_mountPoint), ms); + std::fprintf(stderr, "[VFS] mounted on '%s' in %lldms total\n", + m_mountPoint.c_str(), static_cast<long long>(ms)); } return true; } @@ -346,7 +347,8 @@ void FuseConnector::unmount() flushStaging(); const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::steady_clock::now() - t0).count(); - log::info("VFS: flushed staging in {}ms", ms); + std::fprintf(stderr, "[VFS] flushed staging in %lldms\n", + static_cast<long long>(ms)); } if (m_backingFd >= 0) { @@ -364,8 +366,8 @@ void FuseConnector::unmount() { const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::steady_clock::now() - unmountStart).count(); - log::info("VFS: unmounted from '{}' in {}ms total", - QString::fromStdString(m_mountPoint), ms); + std::fprintf(stderr, "[VFS] unmounted from '%s' in %lldms total\n", + m_mountPoint.c_str(), static_cast<long long>(ms)); } } @@ -456,9 +458,10 @@ void FuseConnector::updateMapping(const MappingType& mapping) deployExternalMappings(mapping, dataDirPath); const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::steady_clock::now() - t0).count(); - log::info("VFS: deployed external mappings ({} symlinks, {} extra files) " - "in {}ms", - m_externalSymlinks.size(), m_extraVfsFiles.size(), ms); + std::fprintf(stderr, "[VFS] deployed external mappings (%zu symlinks, %zu extra files) " + "in %lldms\n", + m_externalSymlinks.size(), m_extraVfsFiles.size(), + static_cast<long long>(ms)); } if (!m_mounted) { @@ -470,7 +473,8 @@ void FuseConnector::updateMapping(const MappingType& mapping) { const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::steady_clock::now() - updateStart).count(); - log::info("VFS: updateMapping completed in {}ms total", ms); + std::fprintf(stderr, "[VFS] updateMapping completed in %lldms total\n", + static_cast<long long>(ms)); } } diff --git a/src/src/organizercore.cpp b/src/src/organizercore.cpp index 4f80e98..6fa0394 100644 --- a/src/src/organizercore.cpp +++ b/src/src/organizercore.cpp @@ -48,6 +48,7 @@ #endif
#include <chrono>
+#include <cstdio>
#include <filesystem>
#include <QApplication>
#include <QCoreApplication>
@@ -2356,7 +2357,8 @@ void OrganizerCore::afterRun(const QFileInfo& binary, DWORD exitCode) }
const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - t0).count();
- log::info("Post-run: restored game directory permissions in {}ms", ms);
+ std::fprintf(stderr, "[VFS] restored game directory permissions in %lldms\n",
+ static_cast<long long>(ms));
}
if (m_CurrentProfile != nullptr) {
diff --git a/src/src/protonlauncher.cpp b/src/src/protonlauncher.cpp index d845b6f..4339920 100644 --- a/src/src/protonlauncher.cpp +++ b/src/src/protonlauncher.cpp @@ -1,6 +1,7 @@ #include "protonlauncher.h" #include <nak_ffi.h> +#include <cstdio> #include <QDir> #include <QFile> #include <QFileInfo> @@ -146,7 +147,23 @@ bool startWithEnv(const QString& program, const QStringList& arguments, } process->setProcessEnvironment(environment); - process->setProcessChannelMode(QProcess::ForwardedChannels); + process->setProcessChannelMode(QProcess::ForwardedOutputChannel); + + // Filter noisy Wine/Proton stderr (GStreamer warnings, etc.) while + // forwarding everything else to our stderr. + QObject::connect(process, &QProcess::readyReadStandardError, process, [process]() { + const QByteArray data = process->readAllStandardError(); + for (const QByteArray& line : data.split('\n')) { + if (line.isEmpty()) + continue; + if (line.contains("GStreamer-WARNING") || line.contains("Failed to load plugin") || + line.contains("ProtonFixes[") || line.contains("wineserver: NTSync") || + line.contains("[MANGOHUD]") || line.contains("radv is not a conformant")) + continue; + std::fwrite(line.constData(), 1, line.size(), stderr); + std::fputc('\n', stderr); + } + }); QObject::connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), |
