You can install error tracking:

Client-side

You can use +client.js in order to make sure that your error tracker is initialized before any other code executes.

// pages/+client.js
 
// This is a good place to initialize an error tracker such as Sentry
Sentry.init()
 
// Custom tracking
window.addEventListener('error', (err) => {
   console.error('An error occurred:', err)
})

Server-side

Server-side errors are exposed over pageContext.errorWhileRendering at renderPage():

// server.js
 
import { renderPage } from 'vike/server'
 
// Any server: Express.js, Cloudflare Worker, AWS Lambda Function, Fastify, Hono, Nitro, ...
server.addMiddleware({
  method: 'GET',
  route: '*', // catch-all
  async handler(request) {
    const pageContext = await renderPage({ urlOriginal: request.url })
 
    if (pageContext.errorWhileRendering) {
      /* Vike already calls console.error() so the following line isn't needed.
      console.error(pageContext.errorWhileRendering)
      */
 
      // If you use an error tracker (e.g. Sentry):
      myErrorTracker.intercept(pageContext.errorWhileRendering)
    }
 
    // The HTTP response of the page.
    // If pageContext.errorWhileRendering is defined then this is usually the error page.
    return pageContext.httpResponse
  }
})

Vike calls console.error(err) for any error it encounters. With the upcoming new hook onLog() (#1439) you'll have full control over Vike's logging.

See also API > Error Page.

You can use any error tracker, such as Sentry, Bugsnag, Rollbar, or your own custom error tracking. For that, make sure to use the error tracker's server-side interceptor. For example with Sentry:

import * as Sentry from "@sentry/node";
 
// ...
 
    if (pageContext.errorWhileRendering) {
      Sentry.captureException(e)
    }
 
// ...

See also