diff --git a/launcher/launch/LaunchTask.cpp b/launcher/launch/LaunchTask.cpp index c524fa097..4468a2a77 100644 --- a/launcher/launch/LaunchTask.cpp +++ b/launcher/launch/LaunchTask.cpp @@ -234,29 +234,40 @@ bool LaunchTask::parseXmlLogs(QString const& line, MessageLevel::Enum level) auto& model = *getLogModel(); model.append(MessageLevel::Error, tr("[Log4j Parse Error] Failed to parse log4j log event: %1").arg(err.value().errMessage)); return false; - } else { - if (!items.isEmpty()) { - auto& model = *getLogModel(); - for (auto const& item : items) { - if (std::holds_alternative(item)) { - auto entry = std::get(item); - auto msg = QString("[%1] [%2/%3] [%4]: %5") - .arg(entry.timestamp.toString("HH:mm:ss")) - .arg(entry.thread) - .arg(entry.levelText) - .arg(entry.logger) - .arg(entry.message); - msg = censorPrivateInfo(msg); - model.append(entry.level, msg); - } else if (std::holds_alternative(item)) { - auto msg = std::get(item).message; - level = LogParser::guessLevel(msg, model.previousLevel()); - msg = censorPrivateInfo(msg); - model.append(level, msg); - } - } + } + + if (items.isEmpty()) + return true; + + auto model = getLogModel(); + for (auto const& item : items) { + if (std::holds_alternative(item)) { + auto entry = std::get(item); + auto msg = QString("[%1] [%2/%3] [%4]: %5") + .arg(entry.timestamp.toString("HH:mm:ss")) + .arg(entry.thread) + .arg(entry.levelText) + .arg(entry.logger) + .arg(entry.message); + msg = censorPrivateInfo(msg); + model->append(entry.level, msg); + } else if (std::holds_alternative(item)) { + auto msg = std::get(item).message; + + MessageLevel::Enum newLevel = MessageLevel::fromLine(msg); + + if (newLevel == MessageLevel::Unknown) + newLevel = LogParser::guessLevel(line); + + if (newLevel == MessageLevel::Unknown) + newLevel = model->previousLevel(); + + msg = censorPrivateInfo(msg); + + model->append(newLevel, msg); } } + return true; } @@ -273,23 +284,10 @@ void LaunchTask::onLogLine(QString line, MessageLevel::Enum level) return; } - // if the launcher part set a log level, use it - auto innerLevel = MessageLevel::fromLine(line); - if (innerLevel != MessageLevel::Unknown) { - level = innerLevel; - } - - auto& model = *getLogModel(); - - // If the level is still undetermined, guess level - if (level == MessageLevel::Unknown) { - level = LogParser::guessLevel(line, model.previousLevel()); - } - // censor private user info line = censorPrivateInfo(line); - model.append(level, line); + getLogModel()->append(level, line); } void LaunchTask::emitSucceeded() diff --git a/launcher/launch/LogModel.cpp b/launcher/launch/LogModel.cpp index 90af9787d..f13e2c27f 100644 --- a/launcher/launch/LogModel.cpp +++ b/launcher/launch/LogModel.cpp @@ -169,8 +169,8 @@ bool LogModel::isOverFlow() MessageLevel::Enum LogModel::previousLevel() { - if (!m_content.isEmpty()) { - return m_content.last().level; + if (m_numLines > 0) { + return m_content[m_numLines - 1].level; } return MessageLevel::Unknown; } diff --git a/launcher/logs/LogParser.cpp b/launcher/logs/LogParser.cpp index 0790dec4d..962e5184f 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 level) +MessageLevel::Enum LogParser::guessLevel(const QString& line) { static const QRegularExpression LINE_WITH_LEVEL("^\\[(?[0-9:]+)\\] \\[[^/]+/(?[^\\]]+)\\]"); auto match = LINE_WITH_LEVEL.match(line); @@ -328,24 +328,26 @@ MessageLevel::Enum LogParser::guessLevel(const QString& line, MessageLevel::Enum // New style logs from log4j QString timestamp = match.captured("timestamp"); QString levelStr = match.captured("level"); - level = MessageLevel::getLevel(levelStr); + + return MessageLevel::getLevel(levelStr); } else { // Old style forge logs if (line.contains("[INFO]") || line.contains("[CONFIG]") || line.contains("[FINE]") || line.contains("[FINER]") || line.contains("[FINEST]")) - level = MessageLevel::Info; + return MessageLevel::Info; if (line.contains("[SEVERE]") || line.contains("[STDERR]")) - level = MessageLevel::Error; + return MessageLevel::Error; if (line.contains("[WARNING]")) - level = MessageLevel::Warning; + return MessageLevel::Warning; if (line.contains("[DEBUG]")) - level = MessageLevel::Debug; + return MessageLevel::Debug; } - if (level != MessageLevel::Unknown) - return level; if (line.contains("overwriting existing")) return MessageLevel::Fatal; - return MessageLevel::Info; + if (line == "---- Minecraft Crash Report ----") + return MessageLevel::Error; + + return MessageLevel::Unknown; } diff --git a/launcher/logs/LogParser.h b/launcher/logs/LogParser.h index aaf21e397..609913d3b 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, MessageLevel::Enum level); + static MessageLevel::Enum guessLevel(const QString& line); protected: std::optional parseAttributes(); diff --git a/launcher/ui/pages/instance/OtherLogsPage.cpp b/launcher/ui/pages/instance/OtherLogsPage.cpp index 69e152475..ef1c4eec9 100644 --- a/launcher/ui/pages/instance/OtherLogsPage.cpp +++ b/launcher/ui/pages/instance/OtherLogsPage.cpp @@ -284,19 +284,13 @@ void OtherLogsPage::reload() MessageLevel::Enum level = MessageLevel::Unknown; QString lineTemp = line; // don't edit out the time and level for clarity - if (!m_instance) { + if (!m_instance) level = MessageLevel::fromLauncherLine(lineTemp); - } else { - // if the launcher part set a log level, use it - auto innerLevel = MessageLevel::fromLine(lineTemp); - if (innerLevel != MessageLevel::Unknown) { - level = innerLevel; - } + else { + level = LogParser::guessLevel(line); - // If the level is still undetermined, guess level - if (level == MessageLevel::StdErr || level == MessageLevel::StdOut || level == MessageLevel::Unknown) { - level = LogParser::guessLevel(line, last); - } + if (level == MessageLevel::Unknown) + level = last; } last = level; diff --git a/tests/XmlLogs_test.cpp b/tests/XmlLogs_test.cpp index e01238570..9e7aed974 100644 --- a/tests/XmlLogs_test.cpp +++ b/tests/XmlLogs_test.cpp @@ -126,7 +126,11 @@ class XmlLogParseTest : public QObject { last = entry.level; } else if (std::holds_alternative(item)) { auto msg = std::get(item).message; - auto level = LogParser::guessLevel(msg, last); + auto level = LogParser::guessLevel(msg); + + if (level == MessageLevel::Unknown) + level = last; + out.append(std::make_pair(level, msg)); last = level; }