How Do I See Logs From My App Once It's Live?
6 min read
Your app is deployed, something is broken, and you have no terminal to stare at.
The short answer: your logs are in your hosting provider's dashboard, not on
your computer. Every console.log and every error your live server prints goes
there. Open your host's logs view, reproduce the problem, and read what it says.
Why you can't find them
Locally, your app runs in a terminal window and everything it prints scrolls past your eyes. In production there is no window. Your code runs on someone else's machine, and anything it prints is captured by the host and tucked into a logs panel you have to go and open.
Your AI agent built the app to run, and it does run. It never had a reason to mention where the output goes once the app leaves your laptop, because you didn't ask and the demo worked without it. So the logging is probably fine. You just have not been shown the door to the room it all lands in.
How to check
Find your host, then open the logs. You almost certainly deployed to one of these:
- Vercel: open your project, click Logs (or Runtime Logs) in the top
nav. Filter by function or by time. For a live tail, run
vercel logsfrom a terminal with the Vercel CLI installed. - Netlify: project → Logs, then Functions for serverless output or Deploys for build-time errors.
- Railway: open your service and click the Deployments tab, then a deployment, to see the live log stream. Railway keeps the terminal-style view you are used to.
- Render / Fly.io: each has a Logs tab on the service; Fly also streams
with
fly logs.
If nothing appears, reproduce the problem in the live app right now and watch. Logs are a live stream, so an empty panel usually means nothing has happened since you opened it, not that logging is broken.
The fix: make your logs actually useful
Finding the panel is half of it. The other half is having something worth reading in there.
- Log at the moment things go wrong, with context. A bare
console.log("here")tells you nothing at 2am. Log what you were doing and the key values:console.error("checkout failed", { userId, orderId, err }). - Use
console.errorfor problems,console.logfor normal flow. Most hosts let you filter by level, so errors stop drowning in routine output. - Log the error object, not just a message.
catch (err) { console.error(err) }preserves the stack trace that tells you which line failed. Swallowing errors with an emptycatchis why so many production bugs are invisible. - Never log secrets or full user records. Passwords, tokens, and API keys in a log are a leak. Log an id, not the whole object.
- Confirm it works: trigger the error path once in production and check the line you expect shows up, with the context you expect.
The trap to avoid
Do not treat scattered console.log calls as your monitoring. Logs are pull, not
push: they only help when you already know something is wrong and go looking. They
will not tell you a user hit a 500 an hour ago while you were asleep, and most
hosts throw older log lines away within days. For anything you actually need to
catch, you want error tracking that alerts you, not a panel you have to remember
to open.
Where this fits
Being able to read your own production logs is table stakes before real users arrive, because the first thing you will do when someone reports a bug is go looking for what the server saw. Pair it with proper error tracking for a vibe-coded app so problems come to you, and with knowing when your app is broken for real users so you find out before they email you. The free Readiness Report checks whether your app has usable logging and alerting wired up for your specific host, and the Finishing Pass sets it up for you if it isn't there yet.