Encodera

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

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

Оглавление

Журнал запросов с morgan

Журнал (лог) — запись о каждом событии на сервере: кто, когда и какой адрес запросил, чем ответил сервер. По журналу ищут ошибки и понимают, что происходит с сайтом. В уроке о middleware мы писали такую функцию сами, а пакет morgan делает это готовыми форматами.

Установка и подключение

npm install morgan

Подключите morgan первой middleware в src/app.js, чтобы он видел все запросы:

// src/app.js
import morgan from 'morgan';
 
const app = express();
 
app.use(morgan('dev'));

Откройте несколько страниц блога. В терминале появятся строки вида GET /posts 200 4.512 ms - 1520: метод, адрес, код ответа, время обработки и размер ответа. Коды раскрашены: успешные зелёным, ошибки красным.

Форматы

ФорматДля чего
devКороткий цветной вывод для разработки
tinyМинимум: метод, адрес, код, время
commonСтандартный формат веб-серверов
combinedКак common, плюс откуда пришёл посетитель и его браузер

Разный журнал для разработки и сервера

На рабочем сервере цвета не нужны, а сведений нужно больше. Выбирайте формат по настройке из src/config.js:

// src/app.js
import { config } from './config.js';
 
app.use(morgan(config.isProduction ? 'combined' : 'dev'));

При запуске с NODE_ENV=production строки станут длиннее и будут содержать IP-адрес, дату и браузер посетителя.

Запись в файл

Опция stream направляет журнал в файл вместо терминала:

// src/app.js
import fs from 'node:fs';
 
const accessLog = fs.createWriteStream('logs/access.log', { flags: 'a' });
app.use(morgan('combined', { stream: accessLog }));

Флаг 'a' дописывает строки в конец файла, а не перезаписывает его. Папку logs/ создайте заранее и добавьте в .gitignore. Впрочем, чаще журнал оставляют в стандартном выводе, а собирает его менеджер процессов — об этом в уроке о развёртывании.

Только ошибки

Опция skip пропускает часть запросов. Так можно записывать только ответы с ошибками:

// src/app.js
app.use(morgan('combined', {
  skip: (req, res) => res.statusCode < 400,
}));

В журнал попадут только ответы с кодом 400 и выше.

Ошибки приложения

morgan записывает запросы, но не подробности исключений. Их выводит обработчик ошибок из главы о middleware — строкой console.error(error). Вместе эти две записи показывают, какой запрос что сломал.

Частая ошибка

Не записывайте в журнал пароли, токены и содержимое форм. Формат combined пишет только адрес, поэтому пароль из тела POST-запроса туда не попадёт. Но если передавать секреты в строке запроса, например /reset?token=..., они окажутся в журнале. Секреты отправляйте в теле запроса или в заголовках.

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

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