Skip to content

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 logs from 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.

  1. 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 }).
  2. Use console.error for problems, console.log for normal flow. Most hosts let you filter by level, so errors stop drowning in routine output.
  3. 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 empty catch is why so many production bugs are invisible.
  4. 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.
  5. 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.