Skip to content

Real-time logs

Logging is a fundamental building block supporting application development — it can provide insights during the initial stages of development and is often times crucial to understanding an issue occurring in production.

The Workers platform captures all console.log’s and uncaught exceptions, in addition to information about the event itself.

Add custom logs

By default a Worker will emit execution logs containing details about the Request, Response and related metadata.

In addition, you can add custom logs throughout your code. Any console.log statements within your Worker will be visible in the dashboard or wrangler tail. The following example demonstrates a custom console.log within a Worker request handler.

export default {
async fetch(request) {
const { cf } = request;
const { city, country } = cf;
console.log(`Request came from city: ${city} in country: ${country}`);
return new Response("Hello worker!", {
headers: { "content-type": "text/plain" },
});
},
};

After you deploy the above code, view the real-time logs in the dashboard or wrangler tail.

View logs from the dashboard

To view real-time logs associated with any deployed Worker using the Cloudflare dashboard:

  1. Log in to the Cloudflare dashboard and select your account.
  2. In Account Home, go to Workers & Pages.
  3. In Overview, select your Worker > and select Logs.

View logs using wrangler tail

To view real-time logs associated with any deployed Worker using Wrangler:

  1. Go to your Worker project directory.
  2. Run npx wrangler tail.

This will log any incoming requests to your application available in your local terminal.

The output of each wrangler tail log is a structured JSON object:

{
"outcome": "ok",
"scriptName": null,
"exceptions": [],
"logs": [],
"eventTimestamp": 1590680082349,
"event": {
"request": {
"url": "https://www.bytesized.xyz/",
"method": "GET",
"headers": {},
"cf": {}
}
}
}

By piping the output to tools like jq, you can query and manipulate the requests to look for specific information:

Terminal window
npx wrangler tail | jq .event.request.url
"https://www.bytesized.xyz/"
"https://www.bytesized.xyz/component---src-pages-index-js-a77e385e3bde5b78dbf6.js"
"https://www.bytesized.xyz/page-data/app-data.json"

You can customize how wrangler tail works to fit your needs. Refer to the wrangler tail documentation for available configuration options.

Limits

Note that:

  • Workers logs are not stored. You can start and stop the stream at any time to view them, but they do not persist.
  • If your Worker has a high volume of traffic, the real-time logs might enter sampling mode. This will cause some of your messages to be dropped and a warning to appear in your logs.
  • Logs from any Durable Objects your Worker is using will show up in the dashboard.
  • A maximum of 10 clients can view a Worker’s logs at one time. This can be a combination of either dashboard sessions or wrangler tail calls.

Persist logs

Logs can be persisted in two ways:

  1. Workers Logpush.
  2. Tail Workers.

Workers Logpush allows you to send Workers Trace Event Logs to a supported destination. Worker’s Trace Events Logpush includes metadata about requests and responses, unstructured console.log() messages and any uncaught exceptions.

Refer to the Workers Logpush documentation to learn how to create and configure Logpush jobs.

Tail Workers allow you to automatically invoke Tail Workers after the invocation of a producer Worker (the Worker the Tail Worker will track) that contains the application logic. It captures events after the producer has finished executing. You can filter, change the format of the data and send events to any HTTP endpoint.

Refer to the Tail Workers documentation to learn how to create and configure Tail Workers.