Every engineering team I've worked on has had the same unspoken job title. Nobody's hired into it. It just lands on whoever's been there longest and answers Slack the fastest.
The translator.
Someone in support pings: "what happened to order #4421?" The translator opens five tabs. Application logs. Sidekiq dashboard. Database. A few greps. Twenty minutes later they paste back: "shipping address validation failed because the customer's postcode hit the new regex, then the retry job ran 3 times, then we rolled back the order."
The support person says thanks. The customer gets an answer. The translator goes back to whatever they were doing before they got pulled out of focus.
This is the actual cost of "observability." Not the bill from Datadog. The bill from your senior engineer's attention.
What logs are vs. what humans need
Logs are designed for the computer that wrote them. Stack traces. Request IDs. Job classes. Foreign keys. A line in a log file is a diff against some piece of internal state, formatted so the system can find it later. That's correct. That's what logs are for.
It's also why nobody outside engineering can read them.
A product manager doesn't care that Sidekiq::Worker#perform ran with args=["gid://app/Order/4421", "ship"]. They care that the shipping label generation for Razvan's order failed because the address didn't validate. Same event. Two completely different representations.
The gap between those two representations is where the translator lives.
ezlogs is the translator
I built ezlogs (a Ruby gem and Next.js companion) because I was tired of being the translator. The premise is small. The gem captures three things you already have:
- HTTP requests (what users and external systems asked for)
- Background jobs (what the system did in response)
- Model callbacks (what changed in the database)
Then it correlates them into a single "action" with a human-readable name. Not "POST /orders/4421/ship returned 422." Instead: "Razvan tried to ship order #4421. Address validation failed. The retry job ran 3 times and gave up."
Same data. The pipeline expands GIDs into names, groups events that share a correlation ID, and renders a deterministic sentence from a template. No model in the loop. The output is reproducible.
What it isn't
It isn't a metrics platform. It doesn't replace Datadog or your APM. It doesn't watch CPU. It doesn't page you at 3am.
It also doesn't write back into your app. No "pause" buttons. No approval queues. No webhooks. The agent reads. That's it. If you want to act on what ezlogs sees, your existing ops tooling does the writing. That's deliberate. A read-only product has a tiny blast radius and a tiny security review.
The job is to explain. The job is to make the activity log something a support person, a PM, or a founder can read without asking an engineer for help.
The boring middle
ezlogs is not an "AI translation tool for logs." The translation is deterministic. Templates plus correlation, same input in, same sentence out, no model in the loop. AI summaries are an optional paid add-on, off by default. The free tier already includes the activity log and an MCP server so your AI agents (Claude, Cursor, internal copilots) can query what happened.
The actual work has been correlation. Making sure the Sidekiq job that ran 4 seconds after the HTTP request gets stitched to that request. Making sure a GlobalID in a job arg resolves back to "User #42 (Razvan)" instead of gid://app/User/42. Making sure the same event captured by the Ruby agent and the Next.js agent produces byte-identical wire format on the server.
None of it demos well. All of it has to be right.
Where it is
ez_logs_agent the Ruby gem is on RubyGems. The Next.js companion is on npm. The hosted dashboard is live at ezlogs.io. Free tier includes the deterministic activity log and the MCP server. Sign up, point an agent at your app, see what it has been doing.
If you want to try it:
- ezlogs.io (free tier, no card)
- ez_logs_agent (Ruby gem)
- ezlogs-nextjs (npm)
If you've ever been the translator on your team and want to stop, say hi.
Razvan