From c018b608169a58bc51cccaeeb8c0a7a071cb2726 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 5 Dec 2025 12:35:21 +0000 Subject: [PATCH] Only continue log level if line starts with whitespace; reintroduce exception detection Signed-off-by: TheKodeToad --- launcher/launch/LaunchTask.cpp | 5 +---- launcher/logs/LogParser.cpp | 12 +++++++++--- launcher/logs/LogParser.h | 2 +- launcher/ui/pages/instance/OtherLogsPage.cpp | 5 +---- tests/XmlLogs_test.cpp | 5 +---- 5 files changed, 13 insertions(+), 16 deletions(-) diff --git a/launcher/launch/LaunchTask.cpp b/launcher/launch/LaunchTask.cpp index 4468a2a77..a0d3b9090 100644 --- a/launcher/launch/LaunchTask.cpp +++ b/launcher/launch/LaunchTask.cpp @@ -257,10 +257,7 @@ bool LaunchTask::parseXmlLogs(QString const& line, MessageLevel::Enum level) MessageLevel::Enum newLevel = MessageLevel::fromLine(msg); if (newLevel == MessageLevel::Unknown) - newLevel = LogParser::guessLevel(line); - - if (newLevel == MessageLevel::Unknown) - newLevel = model->previousLevel(); + newLevel = LogParser::guessLevel(line, model->previousLevel()); msg = censorPrivateInfo(msg); diff --git a/launcher/logs/LogParser.cpp b/launcher/logs/LogParser.cpp index 962e5184f..8ac1a6217 100644 --- a/launcher/logs/LogParser.cpp +++ b/launcher/logs/LogParser.cpp @@ -320,7 +320,7 @@ std::optional LogParser::parseLog4J() throw std::runtime_error("unreachable: already verified this was a complete log4j:Event"); } -MessageLevel::Enum LogParser::guessLevel(const QString& line) +MessageLevel::Enum LogParser::guessLevel(const QString& line, MessageLevel::Enum previous) { static const QRegularExpression LINE_WITH_LEVEL("^\\[(?[0-9:]+)\\] \\[[^/]+/(?[^\\]]+)\\]"); auto match = LINE_WITH_LEVEL.match(line); @@ -343,11 +343,17 @@ MessageLevel::Enum LogParser::guessLevel(const QString& line) return MessageLevel::Debug; } + if (line.contains("Exception: ") || line.contains("Throwable: ")) + return MessageLevel::Error; + + if (line.startsWith("Caused by: ") || line.startsWith("Exception in thread")) + return MessageLevel::Error; + if (line.contains("overwriting existing")) return MessageLevel::Fatal; - if (line == "---- Minecraft Crash Report ----") - return MessageLevel::Error; + if (line.startsWith("\t") || line.startsWith(" ")) + return previous; return MessageLevel::Unknown; } diff --git a/launcher/logs/LogParser.h b/launcher/logs/LogParser.h index 609913d3b..8073ac3cf 100644 --- a/launcher/logs/LogParser.h +++ b/launcher/logs/LogParser.h @@ -59,7 +59,7 @@ class LogParser { std::optional getError(); /// guess log level from a line of game log - static MessageLevel::Enum guessLevel(const QString& line); + static MessageLevel::Enum guessLevel(const QString& line, MessageLevel::Enum previous); protected: std::optional parseAttributes(); diff --git a/launcher/ui/pages/instance/OtherLogsPage.cpp b/launcher/ui/pages/instance/OtherLogsPage.cpp index 2449ecb2b..f53449780 100644 --- a/launcher/ui/pages/instance/OtherLogsPage.cpp +++ b/launcher/ui/pages/instance/OtherLogsPage.cpp @@ -287,10 +287,7 @@ void OtherLogsPage::reload() if (!m_instance) { level = MessageLevel::fromLauncherLine(lineTemp); } else { - level = LogParser::guessLevel(line); - - if (level == MessageLevel::Unknown) - level = last; + level = LogParser::guessLevel(line, last); } last = level; diff --git a/tests/XmlLogs_test.cpp b/tests/XmlLogs_test.cpp index 9e7aed974..99100b66b 100644 --- a/tests/XmlLogs_test.cpp +++ b/tests/XmlLogs_test.cpp @@ -126,10 +126,7 @@ class XmlLogParseTest : public QObject { last = entry.level; } else if (std::holds_alternative(item)) { auto msg = std::get(item).message; - auto level = LogParser::guessLevel(msg); - - if (level == MessageLevel::Unknown) - level = last; + auto level = LogParser::guessLevel(msg, last); out.append(std::make_pair(level, msg)); last = level;