node.js - Winston HTTP-loggnivå beter sig annorlunda än info


Jag använder winston för att logga inkommande förfrågningar på en node v16 express.js-server med följande kodexempel (förenklat till det väsentliga för att återskapa beteendet).

Jag är inte säker på vad som orsakar denna skillnad i beteende och jag kunde inte hitta någon dokumentation som är relevant för det.

Paket :

"express": "^4.17.1",
"winston": "~3.3.3"

Serverskript:

import express from 'express';
import winston from 'winston';

const app = express();

export const TEST_LOGGER = winston.createLogger(
{
  level: 'silly',
  format: winston.format.json(),
  defaultMeta: { service: 'test' },
  transports: [
    new winston.transports.Console({
      format: winston.format.combine(
        winston.format.errors({ stack: true }),
        winston.format.timestamp(),
        winston.format.cli(),
      ),
    }),
  ],
});
TEST_LOGGER.info(`\u27F5 Starting http logging`);
TEST_LOGGER.http(`\u27F5 Starting http logging`);

app.use((req, _response, next) =>
{
  TEST_LOGGER.error(`\u27F5 ${ req.method } '${ req.originalUrl }'`);
  TEST_LOGGER.warn(`\u27F5 ${ req.method } '${ req.originalUrl }'`);
  TEST_LOGGER.info(`\u27F5 ${ req.method } '${ req.originalUrl }'`);
  TEST_LOGGER.verbose(`\u27F5 ${ req.method } '${ req.originalUrl }'`);
  TEST_LOGGER.http(`\u27F5 ${ req.method } '${ req.originalUrl }'`);
  TEST_LOGGER.debug(`\u27F5 ${ req.method } '${ req.originalUrl }'`);
  TEST_LOGGER.silly(`\u27F5 ${ req.method } '${ req.originalUrl }'`);
  next();
});

app.listen(8080, () =>
{
  TEST_LOGGER.info(`\u26A1 'server' launched`);
});

Loggar vid uppstart av servern och vid anrop av /:

info:    ⟵ Starting http logging
http:undefined⟵ Starting http logging
info:     ⚡ 'server' launched
error:   ⟵ GET '/'
warn:    ⟵ GET '/'
info:    ⟵ GET '/'
verbose: ⟵ GET '/'
http:undefined⟵ GET '/'
debug:   ⟵ GET '/'
silly:   ⟵ GET '/'
error:   ⟵ GET '/'
warn:    ⟵ GET '/'
info:    ⟵ GET '/'
verbose: ⟵ GET '/'
http:undefined⟵ GET '/'
debug:   ⟵ GET '/'
silly:   ⟵ GET '/'
error:   ⟵ GET '/'
warn:    ⟵ GET '/'
info:    ⟵ GET '/'
verbose: ⟵ GET '/'
http:undefined⟵ GET '/'
debug:   ⟵ GET '/'
silly:   ⟵ GET '/'

Var kommer de där undefined ifrån?

Problem på GitHub: https://github.com/winstonjs/logform/issues/183

Svar #1

Intressant nog saknas http-loggnivån från standardloggnivåerna i källan:

https://github.com/winstonjs/winston/blob/master/lib/winston.js#L87

// Pass through the target methods onto `winston.
Object.keys(exports.config.npm.levels)
  .concat([
    'log',
    'query',
    'stream',
    'add',
    'remove',
    'clear',
    'profile',
    'startTimer',
    'handleExceptions',
    'unhandleExceptions',
    'handleRejections',
    'unhandleRejections',
    'configure',
    'child'
  ])
  .forEach(
    method => (exports[method] = (...args) => defaultLogger[method](...args))
  );

Och verkar komma från paketet logform:

https://www.npmjs.com/package/logform

Så jag skulle dra slutsatsen att http inte är en giltig Winston-loggnivå, detta bör förmodligen tas upp som ett problem på Winstons GitHub.