From 5ba53cb390e06094587b90bb4e00f000725bfc05 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sun, 8 Mar 2020 14:07:42 -0400 Subject: optimize log parser for very long multi-line messages --- src/SMAPI.Web/Framework/LogParsing/LogParser.cs | 64 +++++++++++++------------ 1 file changed, 34 insertions(+), 30 deletions(-) (limited to 'src/SMAPI.Web/Framework/LogParsing/LogParser.cs') diff --git a/src/SMAPI.Web/Framework/LogParsing/LogParser.cs b/src/SMAPI.Web/Framework/LogParsing/LogParser.cs index cc91ec51..9ef1c53f 100644 --- a/src/SMAPI.Web/Framework/LogParsing/LogParser.cs +++ b/src/SMAPI.Web/Framework/LogParsing/LogParser.cs @@ -282,43 +282,47 @@ namespace StardewModdingAPI.Web.Framework.LogParsing /// The log text can't be parsed successfully. private IEnumerable GetMessages(string logText) { - LogMessage message = new LogMessage(); - using (StringReader reader = new StringReader(logText)) + LogMessageBuilder builder = new LogMessageBuilder(); + using StringReader reader = new StringReader(logText); + while (true) { - while (true) - { - // read data - string line = reader.ReadLine(); - if (line == null) - break; - Match header = this.MessageHeaderPattern.Match(line); - - // validate - if (message.Text == null && !header.Success) - throw new LogParseException("Found a log message with no SMAPI metadata. Is this a SMAPI log file?"); + // read line + string line = reader.ReadLine(); + if (line == null) + break; - // start or continue message - if (header.Success) - { - if (message.Text != null) - yield return message; + // match header + Match header = this.MessageHeaderPattern.Match(line); + bool isNewMessage = header.Success; - message = new LogMessage - { - Time = header.Groups["time"].Value, - Level = Enum.Parse(header.Groups["level"].Value, ignoreCase: true), - Mod = header.Groups["modName"].Value, - Text = line.Substring(header.Length) - }; + // start/continue message + if (isNewMessage) + { + if (builder.Started) + { + yield return builder.Build(); + builder.Clear(); } - else - message.Text += "\n" + line; + + builder.Start( + time: header.Groups["time"].Value, + level: Enum.Parse(header.Groups["level"].Value, ignoreCase: true), + mod: header.Groups["modName"].Value, + text: line.Substring(header.Length) + ); } + else + { + if (!builder.Started) + throw new LogParseException("Found a log message with no SMAPI metadata. Is this a SMAPI log file?"); - // end last message - if (message.Text != null) - yield return message; + builder.AddLine(line); + } } + + // end last message + if (builder.Started) + yield return builder.Build(); } } } -- cgit From e39b9e0d699079edfbcf8595d7499aff894578b6 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sun, 8 Mar 2020 14:38:24 -0400 Subject: fix log parse issues --- docs/release-notes.md | 3 ++- src/SMAPI.Web/Framework/LogParsing/LogMessageBuilder.cs | 5 +++-- src/SMAPI.Web/Framework/LogParsing/LogParser.cs | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) (limited to 'src/SMAPI.Web/Framework/LogParsing/LogParser.cs') diff --git a/docs/release-notes.md b/docs/release-notes.md index fe4349c9..4a136df5 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -11,8 +11,9 @@ * Mods are no longer prevented from suppressing key presses in the chatbox. Use this power wisely. * For the web UI: - * Optimized log parser for very long multi-line log messages. * Added option to upload files using a file picker. + * Optimized log parser for very long multi-line log messages. + * Fixed log parser not detecting folder path in recent versions of SMAPI. * For SMAPI developers: * Added internal API to send custom input to the game/mods. This is mainly meant to support Virtual Keyboard on Android, but might be exposed as a public API in future versions. diff --git a/src/SMAPI.Web/Framework/LogParsing/LogMessageBuilder.cs b/src/SMAPI.Web/Framework/LogParsing/LogMessageBuilder.cs index 371acfd3..42e283a9 100644 --- a/src/SMAPI.Web/Framework/LogParsing/LogMessageBuilder.cs +++ b/src/SMAPI.Web/Framework/LogParsing/LogMessageBuilder.cs @@ -49,7 +49,7 @@ namespace StardewModdingAPI.Web.Framework.LogParsing this.Time = time; this.Level = level; this.Mod = mod; - this.Text.AppendLine(text); + this.Text.Append(text); } /// Add a new line to the next log message being built. @@ -60,7 +60,8 @@ namespace StardewModdingAPI.Web.Framework.LogParsing if (!this.Started) throw new InvalidOperationException("Can't add text, no log message started yet."); - this.Text.AppendLine(text); + this.Text.Append("\n"); + this.Text.Append(text); } /// Get a log message for the accumulated values. diff --git a/src/SMAPI.Web/Framework/LogParsing/LogParser.cs b/src/SMAPI.Web/Framework/LogParsing/LogParser.cs index 9ef1c53f..cce80816 100644 --- a/src/SMAPI.Web/Framework/LogParsing/LogParser.cs +++ b/src/SMAPI.Web/Framework/LogParsing/LogParser.cs @@ -201,7 +201,7 @@ namespace StardewModdingAPI.Web.Framework.LogParsing } // mod path line - else if (message.Level == LogLevel.Debug && this.ModPathPattern.IsMatch(message.Text)) + else if (message.Level == LogLevel.Info && this.ModPathPattern.IsMatch(message.Text)) { Match match = this.ModPathPattern.Match(message.Text); log.ModPath = match.Groups["path"].Value; -- cgit