Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Логирование с 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 вне их.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.