【问题标题】:NodeJS12 Morgan logger skip not working with rotating file streamNodeJS12 Morgan logger跳过不使用旋转文件流
【发布时间】:2020-05-13 15:14:53
【问题描述】:

我正在使用 NodeJS 和 morgan 进行日志记录,并使用旋转文件流来创建日志文件。我想设置应用程序以创建 apache 组合格式的旋转日志文件。代码正在运行,日志在所需目录中创建。但是,跳过功能不起作用。发送到/api/healthcheck 的请求仍然出现在日志中。我已经确认 'skip' url 是正确的,并且在发送对该 url 的请求时与 originalUrl 匹配,并且我已经确认该函数实际上在调用 healthcheck 路由时返回 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' },
));

更新:我仍然有这个问题。它似乎与使用流选项有关。例如,不使用 stream 选项进行日志记录,它会正确跳过 healthcheck 路由,但是当使用 stream 选项时,它不会跳过。这是 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 },
));

【问题讨论】:

  • 你让它工作了吗?我也需要这个。
  • @rbrt 不,但我刚开始赏金所以希望我们能得到一些答案。
  • 你试过app.use(requestLogger('combined', { stream: requestLogStream, flags: 'a', skip: skipLog }));吗? (我把 morgan 的 opts 参数改了)
  • @ManuelSpigolon 似乎有效!!!谢谢!请随意创建这个问题的答案,我将奖励 50 分赏金。赏金将在 2 天内到期。再次感谢。

标签: node.js logging morgan


【解决方案1】:

查看code of morgan,您会看到skipstream 同时受支持。

问题是如何将选项提供给工厂函数:

app.use(requestLogger('combined',
  {
    stream: requestLogStream,
    flags: 'a',
    skip: skipLog
  })
)

它必须是单个对象

【讨论】:

    猜你喜欢
    • 2019-05-12
    • 2020-08-22
    • 2015-01-29
    • 2018-08-07
    • 1970-01-01
    • 2021-02-09
    • 2021-12-20
    • 2016-02-22
    • 1970-01-01
    相关资源
    最近更新 更多