@using Humanizer @using Newtonsoft.Json @using StardewModdingAPI.Toolkit.Utilities @using StardewModdingAPI.Web.Framework @using StardewModdingAPI.Web.Framework.LogParsing.Models @model StardewModdingAPI.Web.ViewModels.LogParserModel @{ ViewData["Title"] = "SMAPI log parser"; IDictionary contentPacks = Model.GetContentPacksByMod(); IDictionary defaultFilters = Enum .GetValues(typeof(LogLevel)) .Cast() .ToDictionary(level => level.ToString().ToLower(), level => level != LogLevel.Trace); JsonSerializerSettings noFormatting = new JsonSerializerSettings { Formatting = Formatting.None }; string curPageUrl = this.Url.PlainAction("Index", "LogParser", new { id = Model.PasteID }, absoluteUrl: true); } @section Head { @if (Model.PasteID != null) { } } @* upload result banner *@ @if (Model.UploadError != null) { } else if (Model.ParseError != null) { } else if (Model.ParsedLog?.IsValid == true) { } @* save warnings *@ @if (Model.UploadWarning != null || Model.Expiry != null) { @if (Model.UploadWarning != null) { ⚠️ @Model.UploadWarning
} } @* upload new log *@ @if (Model.ParsedLog == null) {

Where do I find my SMAPI log?

What system do you use?
    @foreach (Platform platform in new[] { Platform.Android, Platform.Linux, Platform.Mac, Platform.Windows }) {
  • }
On Android:
  1. Open a file app (like My Files or MT Manager).
  2. Find the StardewValley folder on your internal storage.
  3. Open the ErrorLogs subfolder.
  4. The log file is SMAPI-crash.txt if it exists, otherwise SMAPI-latest.txt.
On Linux:
  1. Open the Files app.
  2. Click the options menu (might be labeled Go or ).
  3. Choose Enter Location.
  4. Enter this exact text:
    ~/.config/StardewValley/ErrorLogs
  5. The log file is SMAPI-crash.txt if it exists, otherwise SMAPI-latest.txt.
On Mac:
  1. Open the Finder app.
  2. Click Go at the top, then Go to Folder.
  3. Enter this exact text:
    ~/.config/StardewValley/ErrorLogs
  4. The log file is SMAPI-crash.txt if it exists, otherwise SMAPI-latest.txt.
On Windows:
  1. Press the Windows and R buttons at the same time.
  2. In the 'run' box that appears, enter this exact text:
    %appdata%\StardewValley\ErrorLogs
  3. The log file is SMAPI-crash.txt if it exists, otherwise SMAPI-latest.txt.

How do I share my log?

  1. Drag the file onto this textbox (or choose a file):
  2. Click this button:
  3. On the new page, copy the URL and send it to the person helping you.
} @* parsed log *@ @if (Model.ParsedLog?.IsValid == true) {
@if (Model.ParsedLog.Mods.Any(mod => mod.HasUpdate)) {

Suggested fixes

  • Consider updating these mods to fix problems: @foreach (LogModInfo mod in Model.ParsedLog.Mods.Where(mod => (mod.HasUpdate && mod.ContentPackFor == null) || (contentPacks != null && contentPacks.TryGetValue(mod.Name, out LogModInfo[] contentPackList) && contentPackList.Any(pack => pack.HasUpdate)))) { }
    @mod.Name @if (contentPacks != null && contentPacks.TryGetValue(mod.Name, out LogModInfo[] contentPackList)) {
    @foreach (LogModInfo contentPack in contentPackList.Where(pack => pack.HasUpdate)) { + @contentPack.Name
    }
    }
    @if (mod.HasUpdate) { @(mod.Version == null ? @mod.UpdateVersion : $"{mod.Version} → {mod.UpdateVersion}") } else {   } @if (contentPacks != null && contentPacks.TryGetValue(mod.Name, out contentPackList)) {
    @foreach (LogModInfo contentPack in contentPackList.Where(pack => pack.HasUpdate)) { @contentPack.Version → @contentPack.UpdateVersion
    }
    }
}

Log info

Game info:
Stardew Valley: @Model.ParsedLog.GameVersion on @Model.ParsedLog.OperatingSystem
SMAPI: @Model.ParsedLog.ApiVersion
Folder: @Model.ParsedLog.GamePath
Log started: @Model.ParsedLog.Timestamp.UtcDateTime.ToString("yyyy-MM-dd HH:mm") UTC ({{localTimeStarted}} your time)

@foreach (var mod in Model.ParsedLog.Mods.Where(p => p.Loaded && p.ContentPackFor == null)) { @if (mod.Errors == 0) { } else if (mod.Errors == 1) { } else { } }
Installed mods: @if (!Model.ShowRaw) { click any mod to filter show all hide all }
@mod.Name @mod.Version @if (contentPacks != null && contentPacks.TryGetValue(mod.Name, out LogModInfo[] contentPackList)) {
@foreach (var contentPack in contentPackList) { + @contentPack.Name @contentPack.Version
}
}
@mod.Author @if (contentPacks != null && contentPacks.TryGetValue(mod.Name, out contentPackList)) {
@foreach (var contentPack in contentPackList) { + @contentPack.Author
}
}
no errors@mod.Errors error@mod.Errors errors
@if (!Model.ShowRaw) {
Filter messages: TRACE | DEBUG | INFO | ALERT | WARN | ERROR
@foreach (var message in Model.ParsedLog.Messages) { string levelStr = message.Level.ToString().ToLower(); string sectionStartClass = message.IsStartOfSection ? "section-start" : null; string sectionFilter = message.Section != null && !message.IsStartOfSection ? $"&& sectionsAllow('{message.Section}')" : null; // filter the message by section if applicable v-on:click="toggleSection('@message.Section')" } v-show="filtersAllow('@Model.GetSlug(message.Mod)', '@levelStr') @sectionFilter"> if (message.Repeated > 0) { } }
@message.Time @message.Level.ToString().ToUpper() @message.Mod @message.Text @if (message.IsStartOfSection) { }
repeats [@message.Repeated] times.
view raw log } else {
@Model.ParsedLog.RawText
view parsed log }
} else if (Model.ParsedLog?.IsValid == false) {

Raw log

@Model.ParsedLog.RawText
}