Skip to content

FastLogs 0.5.3 - GameMaker crashes + a real no-UI mode

Latest

Choose a tag to compare

@AitiX AitiX released this 16 Jul 18:31

Fixed

  • Crash grouping worked for Unity only. GameMaker writes [hh:mm:ss] LEVEL: message
    lines and a ===== FASTLOGS SESSION marker; the server's parser knew only Unity's
    [E] +12.345 message and ==== FastLogs session . Every GM log therefore parsed to
    zero entries and every GM crash got a null signature, so the Crashes tab was silently
    empty while the viewer rendered the same log fine. Both grammars are now parsed, one
    crash keeps one signature across engines, and Unity signatures are unchanged (existing
    groups do not split). GM logs already stored were stamped "not a crash" at ingest and
    the lazy backfill only revisits unknowns, so a one-time migration (user_version=1)
    clears that sentinel for GM rows and lets them regroup; Unity rows are untouched.
  • UI > EnableUI did not disable the UI. It was read in exactly one place - the loop
    guard's confirm dialog - so clearing it still constructed the IMGUI overlay, its
    settings panel and a toggle gesture polling input every frame. It now withholds both.

Added

  • FastLogsHeadlessServices: capture, upload, screenshots and clipboard with no overlay
    and no gesture, independent of the config asset. FastLogs.SetServicesProvider(new FastLogsHeadlessServices()) is the documented way to run FastLogs as a plain library.
  • The bundled implementations are public and composable: FastLogsDefaultServices (now
    subclassable - override one factory, keep the rest), CapturingLogSource,
    UnityWebRequestUploader, ScreenshotCapturer, ClipboardService. Previously the UI
    classes were public while everything else was internal, so "everything except the UI"
    was the one thing you could not assemble.
  • Contract 1a makes the logText grammar normative (entry lines, session marker, stack
    frame shapes) and 7.11-7.12 spell out engine identification. A client writing its own
    line format is accepted with a 201 and looks healthy while Crashes, level filters and
    session dividers are silently dead - which is what happened to GameMaker.
  • First captured fixture (server/test/fixtures/) plus a sha256 guard: a real player's
    payload now runs through ingest in the test suite. It immediately pinned a contract
    fact - the Unity client sends no device.application.engine at all and is labelled
    Unity only by the server's fallback, the same fallback that mislabelled GameMaker.
  • CI guard keeping the declared engine-free files free of direct UnityEngine references.

Changed

  • BREAKING: the command channel's poll/ack tier now always requires a token. An app
    with no token configured could previously be polled and acked by anyone who knew its
    id. Registered apps carry a token already and are unaffected.
  • MCP dereferencing of offloaded results is restricted to the configured origin (SSRF).
  • Log-store compaction uses a low-watermark: the store was rewritten in full on every
    line past the cap (~2 MB of IO and ~16 MB of garbage per line at a 2 MB cap).
  • Serialized-field reflection is cached per type; component change detection hashes in
    place; the IMGUI driver stays disabled unless something is actually on screen.
  • Sweeper drains its backlog instead of one batch per tick; X-Forwarded-For is no
    longer trusted blindly; a file cannot be attached to another app's log.
  • GameMaker reports send device.application.engine explicitly, so they no longer rely
    on the server's version-string heuristic.