← Cloudflare Workers / workers / observability / logs
Workers Logs
Workers Logs позволяет автоматически собирать, хранить, фильтровать и анализировать данные журналов, которые формируют Cloudflare Workers. Данные записываются в ваш аккаунт Cloudflare, и вы можете запрашивать их в панели управления для каждого из ваших Workers. Во всех новых Workers параметр Observability включён по умолчанию.
Логи включают журналы вызовов, пользовательские логи, ошибках и необработанных исключениях.
Чтобы отправлять логи стороннему сервису, используйте Экспорт OpenTelemetry (рекомендуется), Workers Logpush, или Tail Workers.
Включите Workers Logs
Чтобы Worker записывал логи в Workers Logs, необходимо добавить настройку observability. Добавьте следующую настройку в файл Wrangler вашего Worker и повторно разверните Worker.
{
"observability": {
"enabled": true,
"head_sampling_rate": 1 // optional. default = 1.
}
}[observability]
enabled = true
head_sampling_rate = 1Head-based выборка позволяет задать процент запросов Workers, которые попадают в лог.
Включение с окружениями
Окружения позволяют развертывать одно и то же приложение Worker с разными конфигурациями. Например, может понадобиться настроить другой head_sampling_rate в staging и production. Чтобы настроить observability для окружения с именем staging: 1. Добавьте следующую конфигурацию под [env.staging]
{
"env": {
"staging": {
"observability": {
"enabled": true,
"head_sampling_rate": 1 // optional
}
}
}
}[env.staging.observability]
enabled = true
head_sampling_rate = 1- Разверните ваш Worker с помощью
npx wrangler deploy -e staging - Повторите шаги 1 и 2 для каждой среды.
Просмотр логов в панели управления
Доступ к логам вашего Worker в панели управления Cloudflare:
-
На панели управления Cloudflare перейдите к разделу Workers & Pages страницу.
Перейдите в Workers & Pages ↗ -
В Обзор, выберите свой Worker.
-
Выберите Observability.
Лучшие практики
Вывод структурированных объектов JSON
Чтобы получить максимум от Workers Logs, рекомендуется вести логи в формате JSON. Workers Logs автоматически извлекает поля и разумно индексирует их в базе данных. Преимущество такого структурированного логирования в том, что оно позволяет легко сегментировать данные по любому измерению для полей с неограниченной кардинальностью. Рассмотрим следующие сценарии:
| Сценарий | Код логирования | Журнал событий (неполный) |
|---|---|---|
| 1 | console.log("user_id: " + 123) |
{message: "user_id: 123"} |
| 2 | console.log({user_id: 123}) |
{user_id: 123} |
| 3 | console.log({user_id: 123, user_email: "[email protected]"}) |
{user_id: 123, user_email: "[email protected]"} |
Разница между этими примерами в том, как вы индексируете логи для ускорения запросов. В сценарии 1 user_id встраивается в сообщение. Чтобы найти все логи, относящиеся к определенному user_id, пришлось бы выполнять текстовый поиск. В сценариях 2 и 3 логи можно фильтровать по ключам user_id и user_email.
Возможности
Журналы вызовов
Каждый вызов Workers возвращает один журнал вызова, который содержит такие сведения, как Request, Response и связанные метаданные. Эти журналы вызовов можно определить по полю $cloudflare.$metadata.type = "cf-worker-event". Каждая запись журнала вызова дополняется информацией, доступной Cloudflare в контексте этого вызова.
В интерфейсе Workers Logs журналы отображаются с локализованной меткой времени и сообщением. Сообщение зависит от обработчика вызова. Например, для запросов Fetch сообщение будет описывать метод и URL запроса, а события cron будут отображаться как cron. Ниже приведён список обработчиков вызова с соответствующими сообщениями.
Журналы вызовов можно отключить в wrangler, добавив invocation_logs = false конфигурации.
{
"observability": {
"logs": {
"invocation_logs": false
}
}
}[observability.logs]
invocation_logs = false| Обработчик вызовов | Сообщение о вызове |
|---|---|
| Alarm | <Scheduled Time> |
| Электронная почта | <Email Recipient> |
| Fetch | <Method> <URL> |
| Queue | <Queue Name> |
| Cron | <UNIX-cron schedule> |
| Tail | tail |
| RPC | <RPC method> |
| WebSocket | <WebSocket Event Type> |
Пользовательские логи
По умолчанию Worker генерирует журналы вызовов содержащий сведения о запросе, ответе и связанных метаданных.
Также можно добавлять собственные логи в любом месте кода. Любой console.log инструкции в вашем Worker будут видны в Workers Logs. Следующий пример демонстрирует пользовательский console.log внутри обработчика запросов Worker.
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" },
});
},
};addEventListener("fetch", (event) => {
event.respondWith(handleRequest(event.request));
});
/**
* Respond with hello worker text
* @param {Request} request
*/
async function handleRequest(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" },
});
}После развёртывания приведённого выше кода просмотрите журналы своего Worker в панель управления или с логи в реальном времени.
Head-based выборка
Head-based выборка позволяет логировать определённый процент входящих запросов к вашему Cloudflare Worker. Особенно для приложений с высокой нагрузкой это помогает сократить объём логов и снизить затраты, сохраняя при этом полезную информацию о производительности приложения. При настройке коэффициента head-based выборки вы можете управлять долей запросов, которые попадают в логи. При этом собираются все логи в контексте запроса.
Чтобы включить head-based выборку, задайте head_sampling_rate в конфигурации observability. Допустимый диапазон от 0 до 1, где 0 означает, что не логируется ни один запрос из ста, а 1 означает, что логируется каждый запрос. Если head_sampling_rate не указан, используется значение по умолчанию 1 (100%). В примере ниже head_sampling_rate равно 0.01, то есть в журнал записывается один из каждых ста запросов.
{
"observability": {
"enabled": true,
"head_sampling_rate": 0.01 // 1% sampling rate
}
}[observability]
enabled = true
head_sampling_rate = 0.01Лимиты
| Описание | Лимит |
|---|---|
| Максимальный срок хранения логов | 7 дней |
| Максимальное количество логов на аккаунт в день1 | 5 миллиардов |
| Максимальный размер лога2 | 256 KB |
1 Существует суточный лимит в 5 миллиардов логов на аккаунт в день. После превышения лимита в течение оставшейся части дня будет применяться 1% выборка (head-based sample).
2 Максимальный размер одного лога составляет 256
KB. Логи, превышающие этот размер, будут
обрезаны, а $cloudflare.truncated поле будет установлено в true.
Цены
Workers Logs включён и в план Free, и в план Paid Тарифы Workers.
| Записанные события лога | Срок хранения | |
|---|---|---|
| Workers Free | 200,000 в день | 3 дня |
| Workers Paid | 20 миллионов включено в месяц +$0.60 за каждый дополнительный миллион |
7 дней |
Примеры
Пример 1
Worker обрабатывает 15 миллионов запросов в месяц. Каждый запрос создает 1 журнал вызова и 1 console.log. head_sampling_rate настроен на значение 1.
| Ежемесячные затраты | Формула | |
|---|---|---|
| Журналы | $6.00 | ((15,000,000 запросов в месяц * 2 лога на запрос * 100% выборка) - 20,000,000 включённых логов) / 1,000,000 * $0.60 |
| Всего | $6.00 |
Пример 2
Worker обрабатывает 1 миллиард запросов в месяц. Каждый запрос создает 1 журнал вызова и 1 console.log. head_sampling_rate настроен на значение 0.1.
| Ежемесячные затраты | Формула | |
|---|---|---|
| Журналы | $108.00 | ((1,000,000,000 запросов в месяц * 2 лога на запрос * 10% выборка) - 20,000,000 включённых логов) / 1,000,000 * $0.60 |
| Всего | $108.00 |