Only continue log level if line starts with whitespace; reintroduce exception detection

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
This commit is contained in:
TheKodeToad
2025-12-05 12:35:21 +00:00
parent 92738feeba
commit c018b60816
5 changed files with 13 additions and 16 deletions

View File

@@ -257,10 +257,7 @@ bool LaunchTask::parseXmlLogs(QString const& line, MessageLevel::Enum level)
MessageLevel::Enum newLevel = MessageLevel::fromLine(msg); MessageLevel::Enum newLevel = MessageLevel::fromLine(msg);
if (newLevel == MessageLevel::Unknown) if (newLevel == MessageLevel::Unknown)
newLevel = LogParser::guessLevel(line); newLevel = LogParser::guessLevel(line, model->previousLevel());
if (newLevel == MessageLevel::Unknown)
newLevel = model->previousLevel();
msg = censorPrivateInfo(msg); msg = censorPrivateInfo(msg);

View File

@@ -320,7 +320,7 @@ std::optional<LogParser::ParsedItem> LogParser::parseLog4J()
throw std::runtime_error("unreachable: already verified this was a complete log4j:Event"); 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("^\\[(?<timestamp>[0-9:]+)\\] \\[[^/]+/(?<level>[^\\]]+)\\]"); static const QRegularExpression LINE_WITH_LEVEL("^\\[(?<timestamp>[0-9:]+)\\] \\[[^/]+/(?<level>[^\\]]+)\\]");
auto match = LINE_WITH_LEVEL.match(line); auto match = LINE_WITH_LEVEL.match(line);
@@ -343,11 +343,17 @@ MessageLevel::Enum LogParser::guessLevel(const QString& line)
return MessageLevel::Debug; 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")) if (line.contains("overwriting existing"))
return MessageLevel::Fatal; return MessageLevel::Fatal;
if (line == "---- Minecraft Crash Report ----") if (line.startsWith("\t") || line.startsWith(" "))
return MessageLevel::Error; return previous;
return MessageLevel::Unknown; return MessageLevel::Unknown;
} }

View File

@@ -59,7 +59,7 @@ class LogParser {
std::optional<Error> getError(); std::optional<Error> getError();
/// guess log level from a line of game log /// 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: protected:
std::optional<LogEntry> parseAttributes(); std::optional<LogEntry> parseAttributes();

View File

@@ -287,10 +287,7 @@ void OtherLogsPage::reload()
if (!m_instance) { if (!m_instance) {
level = MessageLevel::fromLauncherLine(lineTemp); level = MessageLevel::fromLauncherLine(lineTemp);
} else { } else {
level = LogParser::guessLevel(line); level = LogParser::guessLevel(line, last);
if (level == MessageLevel::Unknown)
level = last;
} }
last = level; last = level;

View File

@@ -126,10 +126,7 @@ class XmlLogParseTest : public QObject {
last = entry.level; last = entry.level;
} else if (std::holds_alternative<LogParser::PlainText>(item)) { } else if (std::holds_alternative<LogParser::PlainText>(item)) {
auto msg = std::get<LogParser::PlainText>(item).message; auto msg = std::get<LogParser::PlainText>(item).message;
auto level = LogParser::guessLevel(msg); auto level = LogParser::guessLevel(msg, last);
if (level == MessageLevel::Unknown)
level = last;
out.append(std::make_pair(level, msg)); out.append(std::make_pair(level, msg));
last = level; last = level;