<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ali atwa</title>
    <description>The latest articles on DEV Community by ali atwa (@alyatwa).</description>
    <link>https://dev.to/alyatwa</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F127722%2F57700cc1-7e9f-45c9-8ee6-2669a0c247f4.jpeg</url>
      <title>DEV Community: ali atwa</title>
      <link>https://dev.to/alyatwa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alyatwa"/>
    <language>en</language>
    <item>
      <title>Best Tools for Debugging Modern Web Apps (Next.js, Logs, and Beyond)</title>
      <dc:creator>ali atwa</dc:creator>
      <pubDate>Thu, 28 Aug 2025 15:07:58 +0000</pubDate>
      <link>https://dev.to/alyatwa/best-tools-for-debugging-modern-web-apps-nextjs-logs-and-beyond-13j6</link>
      <guid>https://dev.to/alyatwa/best-tools-for-debugging-modern-web-apps-nextjs-logs-and-beyond-13j6</guid>
      <description>&lt;p&gt;Debugging a modern web app is rarely as simple as checking your browser console.&lt;br&gt;
When you’re building with frameworks like Next.js, your app often relies on multiple external services: Stripe for payments, AWS Lambda for serverless functions, Sentry for error tracking, Google Cloud for infra, etc.&lt;/p&gt;

&lt;p&gt;When something breaks, the logs are spread across 5 different dashboards. You end up context-switching more than actually fixing the bug.&lt;/p&gt;

&lt;p&gt;Over the past few years, I’ve tried countless ways to improve debugging speed. Here are some of the best tools and approaches that actually help.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Sentry — Error tracking made simple
&lt;/h2&gt;

&lt;p&gt;Sentry is still one of the best tools for catching runtime errors in production. With Next.js integration, you can quickly capture exceptions from both frontend and API routes.&lt;/p&gt;

&lt;p&gt;✅ Features I love:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic stack traces&lt;/li&gt;
&lt;li&gt;Source maps for Next.js builds&lt;/li&gt;
&lt;li&gt;Alerts on new issues&lt;/li&gt;
&lt;li&gt;But Sentry alone doesn’t give you the full story — just the exception.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  2. AWS CloudWatch (or GCP Logging) — Serverless debugging
&lt;/h2&gt;

&lt;p&gt;If you’re deploying Next.js with serverless functions (e.g., on Vercel, AWS Lambda, or Cloud Run), logs often end up in CloudWatch or Google Cloud Logging.&lt;/p&gt;

&lt;p&gt;✅ Useful for:&lt;/p&gt;

&lt;p&gt;Seeing console.log output from API routes&lt;br&gt;
Tracing performance bottlenecks in functions&lt;br&gt;
The downside: the UI isn’t developer-friendly, and you still have to keep another tab open.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stripe Dashboard Logs — Payments debugging
If you use Stripe webhooks in your Next.js app, debugging failed events is a constant struggle. You check the Stripe logs, then jump to your function logs, then maybe check Sentry.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stripe’s dashboard is great, but again — it’s one more tool to keep open.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. &lt;a href="https://chromewebstore.google.com/detail/benchwrk/bbipbannkhfdbiedliabpdiglcboinan" rel="noopener noreferrer"&gt;Chrome extension&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Here’s where I tried something different. Instead of switching between dashboards, I built a small chrome extension that unifies all these logs into one place.&lt;/p&gt;

&lt;p&gt;Imagine this:&lt;/p&gt;

&lt;p&gt;You run your Next.js app locally.&lt;br&gt;
Inside your own admin panel or dev tools, you drop in&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @benchwrk/logger

import { Logger } from "@benchwrk/logger";

// Initialize logger with your API key
const logger = new Logger({ apiKey: "12345" });

// Log messages with different levels
logger.info("User logged in successfully", { userId: 123 });

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suddenly you see Stripe events, CloudWatch logs, and Sentry errors streaming in real time — in a single UI.&lt;br&gt;
✅ Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time log stream with WebSockets&lt;/li&gt;
&lt;li&gt;Unified filters (source, log level, keywords)&lt;/li&gt;
&lt;li&gt;No tab-switching — logs appear inside your app’s own frontend&lt;/li&gt;
&lt;li&gt;Perfect for local debugging or internal dashboards
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdsn0kq1dc3tuhahsuk9r.png" alt=" " width="800" height="200"&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>monitoring</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
