Логирование с Pino
Лог — запись о том, что происходит на сервере: пришёл запрос, произошла ошибка, создана статья. Fastify использует логгер Pino, который пишет каждую запись одной строкой JSON — её удобно читать программам для сбора логов.
Включение и уровень
Логгер включается опцией logger при создании приложения. Вместо true можно передать объект с настройками:
// src/server.js
import { buildApp } from './app.js';
const app = buildApp({
logger: { level: 'info' },
});Уровень отсекает менее важные записи: при info сообщения debug и trace не пишутся.
| Уровень | Для чего |
|---|---|
fatal | Сервер не может работать дальше |
error | Ошибка при обработке запроса |
warn | Подозрительная ситуация |
info | Обычные события: запросы, старт сервера |
debug | Подробности для отладки |
trace | Самые мелкие детали |
Лог из маршрута
У каждого запроса есть свой логгер request.log. Добавьте запись в маршрут создания статьи:
// src/routes/posts.js
app.post('/posts', async (request, reply) => {
const post = { id: app.posts.length + 1, ...request.body };
app.posts.push(post);
request.log.info({ postId: post.id }, 'Статья создана');
return reply.code(201).send(post);
});После POST /posts в терминале появится строка с полями "postId":3, "msg":"Статья создана" и reqId — номером запроса. По reqId можно найти все записи одного запроса.
Читаемый вывод
JSON неудобно читать глазами. Для разработки установите pino-pretty:
npm install --save-dev pino-pretty// src/server.js
const app = buildApp({
logger: {
level: 'debug',
transport: { target: 'pino-pretty' },
},
});Теперь каждая запись — цветная строка со временем, уровнем и сообщением. На рабочем сервере transport не указывают: там нужен обычный JSON.
Скрытие секретов
Опция redact заменяет значения указанных полей на [Redacted]:
// src/server.js
const app = buildApp({
logger: {
level: 'info',
redact: ['req.headers.authorization'],
},
});Токены из заголовка Authorization не попадут в логи, даже если запрос будет записан целиком.
Лог приложения
Вне запросов используйте app.log — например, при запуске и остановке:
// src/server.js
app.log.info('Блог запускается');Частая ошибка
console.log внутри маршрутов работает, но такие записи не имеют уровня и reqId, их нельзя отфильтровать или отключить. Пишите через request.log в маршрутах и app.log вне их.