SAASY LOGS

We find the SaaS in your logs.

Your code is the map, the log is the path that was actually taken. The problem is the output is hard to read. There are many paths it can take, and getting a clear view of the route shouldn't be hard. Saasy Logs is the key to that map. It decodes the path taken and tells you every stop along the way — every trigger, flow, workflow rule, validation and class it hit, in the order it hit them, on the records it touched. Salesforce writes all of it down and then makes it unreadable. Paste one into a Google Sheet and read it back.

Salesforce Apex debug logs, specifically — not affiliated with, endorsed by, or sponsored by Salesforce, Inc.

See what works today Read the blog

It's in beta, which here means: email me and I'll set you up. Ask for access — and if you have a log that breaks it, send me that instead. That's how the last three bugs got found.

Every stop along the way

This is the part no amount of reading the code will give you. Your repo says what can run. The log says what did — in order, with the handler that called it and the record it ran against, so you can filter to one trigger, one class or one object and watch the rest fall away.

Excerpt of a trace, inside a trigger
KindClassMethodObjectms
TriggerOrderItem178.6
MethodTriggerRouterRun(IHandler)OrderItem176.7
MethodOrderItemHandlerIsDisabled()OrderItem62.4
MethodHandlerSettingsfindRelatedSettings(Id, Id)OrderItem59.8
WorkflowRecalculate Order Total ×4OrderItem

Real timings, real shape, from a production log — the class names are invented, because the originals belonged to somebody’s org. Two things fall out of it that no amount of reading the code would: a third of the trigger’s runtime goes on IsDisabled(), checking whether it should run at all, and a workflow rule fired four times on the way past. Nobody debugging that trigger was looking at a workflow rule.

A diagnosis, not a data dump

A debug log will happily tell you 168,000 things. Almost none of them matter. Underneath the summary you get the shortlist.

Example ranked findings from a debug log
SeverityFindingWhere
CRITICAL CPU time exceeded: 30,064 of 25,000 (120%) namespace (default)
ERROR System.LimitException: Apex CPU time limit exceeded findRelatedSettings, Apex line 22 — 5 occurrences
WARN 10.40 s unlogged gap (60% of transaction) between SOQL_EXECUTE_END and DML_BEGIN
WARN Log is incomplete — Salesforce discarded 35.8 MB Timings across the skip are unreliable
INFO 104.5 s self time in updateChildRecords 25 calls · 125 s total · 25 DML — DML inside a loop

And it says so out loud

The log already knows all of this. It just won't say it in a sentence. Every line is something that happened — and the expensive part is often the gap between two of them.

What happened

10.40 s — 60% of the whole transaction — is unlogged time, between SOQL_EXECUTE_END and DML_BEGIN.

Overall, 96% of the elapsed time has no log line explaining it.

2 updates cost 5.13 s across 5 rows; the slowest single one took 4.63 s. That span includes every trigger, flow and validation the save set off — not just the write.

Real output from a real 25 MB production log. Those two log lines sit next to each other in the file. I'd scrolled past them for years.

Where the project actually is

Now is what I've run against a real log in a real spreadsheet. Next is what I'm building. Later is a wish list, and wish lists are free.

Now
Working and verified
  • The route, in order. Triggers, flows, workflow rules, validations, classes.
  • Filter without re-running. By trigger, class, method, object or limit type.
  • A summary in sentences. The duck goes first.
  • The shortlist. Fatal errors, blown limits, unlogged gaps, hotspots — ranked.
  • Honest about holes. It says when the log is incomplete.
  • Scrub before you share. You choose what it keeps.
  • No Drive permission. Just the sheet you opened it from.
Being built now
  • The Marketplace listing. Install it the normal way.
  • Open a file. Instead of pasting one.
  • The 101 hunt. Which query keeps running, and who calls it.
  • Async hand-offs. Where the trail leaves this log.
  • Name the managed package. Whose code the missing time belongs to.
Later
Wanted, not started
  • Benchmarks you can keep. Find out whether the fix helped.
  • Lead with the error you got. The 9am email, answered first.
  • One transaction, many logs. Put a shattered journey back together.
  • Before and after. Two runs, side by side.
  • Enormous logs, in chunks.