Docs

Tracking Errors

Catch critical failures before your users report them. Use it for errors you need to know about instantly, not every 4xx.


When to use it

Use LogIt.Now() for failures where you want a tap on the shoulder right now:

  • Checkout processing crashed
  • Email delivery failed for a real user
  • Stripe webhook handler threw an exception
  • Background job failed after all retries

Info: LogIt.Now() is complementary to Sentry, not a replacement. Use Sentry for all errors, LogIt.Now() for the ones you need to know about instantly.

Basic error event

ts
try {
  await processCheckout(cart);
} catch (err) {
  await logit.now("errors", {
    event: "Checkout failed",
    description: err instanceof Error ? err.message : "Unknown error",
    icon: "❌",
    notify: true,
    tags: { severity: "high", component: "checkout" },
    metadata: {
      userId: user.id,
      cartId: cart.id,
      errorMessage: err instanceof Error ? err.message : String(err),
    },
  });
  throw err; // re-throw so your error boundary handles it too
}

Severity tagging

ts
// Use a consistent set of values across your codebase
type Severity = "low" | "medium" | "high" | "critical";

tags: { severity: "critical" satisfies Severity, component: "payments" }

With stack context

ts
await logit.now("errors", {
  event: "Unhandled API error",
  description: err.message,
  icon: "🔥",
  notify: true,
  tags: { severity: "critical", route: req.path },
  metadata: {
    message: err.message,
    stack: err.stack,
    method: req.method,
    url: req.url,
    userId: req.user?.id,
  },
});

Background jobs

ts
async function runWeeklyDigest() {
  try {
    await sendDigestEmails();
  } catch (err) {
    await logit.now("jobs", {
      event: "Weekly digest job failed",
      icon: "💥",
      notify: true,
      tags: { job: "weekly-digest", severity: "high" },
      metadata: {
        error: err instanceof Error ? err.message : String(err),
        stack: err instanceof Error ? err.stack : undefined,
      },
    });
  }
}