web-dev-qa-db-ja.com

単体テストの実行時にウィンストンロギングを無効にしますか?

ノードモジュールの単体テストを実行するときに、ウィンストンロギングを選択的に無効にできますか?

理想的には、アプリケーションの実行中に情報提供とデバッグの目的でログを記録したいのですが、テストの実行時にプレゼンテーションユニットテストの結果が乱雑にならないように抑制したいと思います。

私の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
  }
}   
18
Sk606

Winstonのトランスポートには、設定可能なsilentプロパティがあります。これは、トランスポート全体を削除するよりも少しいいでしょう。

トランスポートに名前を追加して、次のように少し簡単にします。

var logger = new winston.Logger();

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

次に、テストまたはセットアップで、次の方法で選択的にログのオンとオフを切り替えることができます。

logger.transports['console.info'].silent = true  // turns off
logger.transports['console.info'].silent = false // logging back on
18
Mark Meyer

Jestを使用している場合、次のように無効にできます。

  1. Jestがテストを実行する前に実行するファイルを設定します。 package.json

    {
        "jest": {
            "setupFiles": ["<rootDir>/jest-set-up/index.js"]
        }
    }
    
  2. jest-set-up/index.js

    import winston from 'winston'
    winston.remove(winston.transports.Console)
    
9
Quan Vuong

申し訳ありませんが、これは少し古い質問です。

私がしていることは少しWhatいですが、Jestの_--silent_オプションを通常どおり使用し続けることができます。 Winstonのsilentprocess.argv.indexOf("--silent") >= 0に設定しました。例えば:

_const logger = new winston.Logger({
  …,
  transports: [
    new winston.transports.Console({
      …,
      silent: process.argv.indexOf("--silent") >= 0,
    }),
  ],
});
_
7

ロガーを作成します。

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

すべてのロギングを黙らせる:

logger.transports.forEach((t) => (t.silent = true));
3
shusson

私のセットアップは次のとおりです。

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;
2
Joel

セットアップ用のものはうまくいきませんでした。ウィンストンv3.1.0を使用しています。ロガーを作成する新しい方法があります。

Winstonサイトから: https://github.com/winstonjs/winston

Winstonの推奨される使用方法は、独自のロガーを作成することです。これを行う最も簡単な方法は、winston.createLoggerを使用することです。

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.json(),
    transports: [
      //
      // - Write to all logs with level `info` and below to `combined.log` 
      // - Write all logs error (and below) to `error.log`.
      //
      new winston.transports.File({ filename: 'error.log', level: 'error' }),
      new winston.transports.File({ filename: 'combined.log' })
    ]
  });

  //
  // If we're not in production then log to the `console` with the format:
  // `${info.level}: ${info.message} JSON.stringify({ ...rest }) `
  // 
  if (process.env.NODE_ENV !== 'production') {
    logger.add(new winston.transports.Console({
    format: winston.format.simple()
  }));
}

Logger.jsでこれを行います

if (process.env.NODE_ENV === 'test') {
    return winston.createLogger({
      transports: [ new winston.transports.Console({ level: 'error'}) ]
    });
}

これにより、エラーが発生しない限り、すべてのログメッセージが停止します。エラーが発生した場合は、問題のデバッグに役立てたいと考えています。

お役に立てれば。

1
englishPete