summaryrefslogtreecommitdiff
path: root/src/SMAPI.Web/Framework/LogParsing/LogParser.cs
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2020-03-08 14:07:42 -0400
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2020-03-08 14:07:42 -0400
commit5ba53cb390e06094587b90bb4e00f000725bfc05 (patch)
tree87f710a76dbaf570fb8619a4ee270bd21a8fbf67 /src/SMAPI.Web/Framework/LogParsing/LogParser.cs
parent29fdf9ae4a91131f758035ab79fbfe0595ff1eca (diff)
downloadSMAPI-5ba53cb390e06094587b90bb4e00f000725bfc05.tar.gz
SMAPI-5ba53cb390e06094587b90bb4e00f000725bfc05.tar.bz2
SMAPI-5ba53cb390e06094587b90bb4e00f000725bfc05.zip
optimize log parser for very long multi-line messages
Diffstat (limited to 'src/SMAPI.Web/Framework/LogParsing/LogParser.cs')
-rw-r--r--src/SMAPI.Web/Framework/LogParsing/LogParser.cs64
1 files changed, 34 insertions, 30 deletions
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
/// <exception cref="LogParseException">The log text can't be parsed successfully.</exception>
private IEnumerable<LogMessage> 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<LogLevel>(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<LogLevel>(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();
}
}
}