Журнал запросов с 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=..., они окажутся в журнале. Секреты отправляйте в теле запроса или в заголовках.