运行单元测试时禁用winston日志记录?

Sk6*_*606 19 unit-testing node.js winston

在执行节点模块的单元测试时,是否可以选择性地禁用Winston日志记录?

理想情况下,我希望在应用程序运行时进行信息和调试目的的记录,但是在我运行测试时不要使表示单元测试结果混乱.

我对winston的使用是我模块的内部,如下所示:

// MyModule.js
var logger = require('winston');
module.exports = function() {
  // does some stuff
  // and logs some stuff like so:
  logger.log('an informational message');
}

// MyModuleTest.js
describe('MyModule', fucntion() {
  it('should do some stuff', function() {
     var myModuleUnderTest = require('MyModule');
     // some tests
  }
}   
Run Code Online (Sandbox Code Playgroud)

Mar*_*yer 19

温斯顿运输有一个silent你可以设置的属性,这可能比删除整个运输更好.

我为传输添加一个名称,使其更容易:

var logger = new winston.Logger();

logger.add(winston.transports.Console, {
    name: 'console.info',
    colorize: true,
    showLevel: true,
    formatter: consoleFormatter,
})
Run Code Online (Sandbox Code Playgroud)

然后在测试或设置中,我可以选择性地打开和关闭登录:

logger.transports['console.info'].silent = true  // turns off
logger.transports['console.info'].silent = false // logging back on
Run Code Online (Sandbox Code Playgroud)

  • 您可以将“silent”添加到“createLogger”,而不是添加到每个传输器:“createLogger({silent: true, ... })”。如果您想静默所有日志,这很有用。 (3认同)

ya_*_*mon 12

我们在测试中使用了以下silent属性:

import logger from './my-defined-winston-logger'


//...
beforeAll(() => {
  logger.silent = true;
})
afterAll(() => {
  logger.silent = false;
})
Run Code Online (Sandbox Code Playgroud)


Qua*_*ong 9

如果你正在使用Jest,你可以像这样禁用它:

  1. 设置在jest运行测试之前运行的设置文件.在package.json:

    {
        "jest": {
            "setupFiles": ["<rootDir>/jest-set-up/index.js"]
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. jest-set-up/index.js:

    import winston from 'winston'
    winston.remove(winston.transports.Console)
    
    Run Code Online (Sandbox Code Playgroud)


小智 9

对不起,我知道这是一个老问题.

我做的有点难看,但允许我继续--silent正常使用Jest的选项.我只是将温斯顿设置silentprocess.argv.indexOf("--silent") >= 0.例如:

const logger = new winston.Logger({
  …,
  transports: [
    new winston.transports.Console({
      …,
      silent: process.argv.indexOf("--silent") >= 0,
    }),
  ],
});
Run Code Online (Sandbox Code Playgroud)

  • `silent:process.env.NODE_ENV ==='testing'`也是一种选择 (6认同)
  • 啊,我应该说只有当你在运行测试时 ** 总是** 想要让 winston 静音时,这才是一个选项。 (2认同)
  • 当您测试一组测试文件时,这不起作用。看起来它没有使 argv 可供检查。 (2认同)

Joe*_*oel 7

这是我的设置:

const { createLogger, format, transports, config } = require("winston");

let level, silent;
switch (process.env.NODE_ENV) {
  case "production":
    level = "warning";
    silent = false;
    break;
  case "test":
    level = "emerg";
    silent = true;
    break;
  default:
    level = "debug";
    silent = false;
    break;
}

const options = {
  console: {
    level,
    silent,
    handleExceptions: true,
    format: format.combine(
      format.colorize(),
      format.splat(),
      format.printf(
        info => `${new Date().toISOString()} ${info.level}: ${info.message}`,
      ),
    ),
  },
};

const logger = createLogger({
  levels: config.syslog.levels,
  transports: [new transports.Console(options.console)],
  exitOnError: false,
});

module.exports = logger;
Run Code Online (Sandbox Code Playgroud)


shu*_*son 6

创建一个记录器:

const logger = createLogger({
    level: "info",
    format: format.json(),
    transports: []
});
Run Code Online (Sandbox Code Playgroud)

使所有日志保持静音:

logger.transports.forEach((t) => (t.silent = true));
Run Code Online (Sandbox Code Playgroud)