NodeJS12 Morgan logger не работает с вращающимся потоком файлов - PullRequest
0 голосов
/ 21 января 2020

Я использую NodeJS с morgan для ведения журнала и вращения файла-потока для создания файлов журнала. Я хочу настроить приложение для создания вращающегося файла журнала в комбинированном формате apache. Код работает, журнал создается в нужной директории. Однако функция пропуска не работает. Запросы, отправленные на /api/healthcheck, все еще появляются в журнале. Я подтвердил, что URL «skip» правильный и соответствует originalUrl при отправке запроса на этот URL, и я подтвердил, что функция действительно возвращает true при вызове маршрута проверки здоровья.

const logger = require('morgan');

/* Logger */
// Logger skip url
const loggerSkipUrl = '/api/healthcheck';

// Create a rotating write stream
let accessLogStream = rfs.createStream('server.log', {
  interval: '1d', // Rotate daily
  maxFiles: 30, // Maximum number of rotated files to keep in storage
  compress: 'gzip', // Compress rotated files
  path: path.join(__dirname, 'logs'),
})

// Log requests in the Apache combined format to one log file per day
app.use(logger('combined',
  { stream: accessLogStream }, // Works but doesn't skip
  { skip: (req, res) => req.originalUrl === loggerSkipUrl }, // Does not skip
  { flags: 'a' },
));

ОБНОВЛЕНИЕ: у меня все еще есть эта проблема. Похоже, это связано с использованием опции потока. Например, ведение журнала без параметра потока, он правильно пропускает маршрут проверки работоспособности, но при использовании параметра потока он не пропускается. Это проблема конфигурации или ошибка в модуле регистрации Morgan?

function skipLog(req, res) {
  const answer = req.originalUrl.indexOf('healthcheck') > -1;
  console.log(`skipLog ${answer}`);
  return answer;
}

/* SKIP WORKS WITHOUT STREAM OPTION */

// Log API requests to console
app.use(requestLogger('dev', { skip: skipLog }));


/* SKIP DOES NOT WORK WITH STREAM OPTION */

requestLogStream = rfs.createStream('request.log', {
  interval: '1d', // Rotate daily
  maxFiles: 30, // Maximum number of rotated files to keep in storage
  path: path.join(__dirname, `logs/${hostname}`)
});

// Log API requests in the Apache combined format to one log file per day
app.use(requestLogger('combined',
  { stream: requestLogStream },
  { flags: 'a' },
  { skip: skipLog },
));
...