ノードモジュールの単体テストを実行するときに、ウィンストンロギングを選択的に無効にできますか?
理想的には、アプリケーションの実行中に情報提供とデバッグの目的でログを記録したいのですが、テストの実行時にプレゼンテーションユニットテストの結果が乱雑にならないように抑制したいと思います。
私の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
}
}
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
Jestを使用している場合、次のように無効にできます。
Jestがテストを実行する前に実行するファイルを設定します。 package.json
:
{
"jest": {
"setupFiles": ["<rootDir>/jest-set-up/index.js"]
}
}
jest-set-up/index.js
:
import winston from 'winston'
winston.remove(winston.transports.Console)
申し訳ありませんが、これは少し古い質問です。
私がしていることは少しWhatいですが、Jestの_--silent
_オプションを通常どおり使用し続けることができます。 Winstonのsilent
をprocess.argv.indexOf("--silent") >= 0
に設定しました。例えば:
_const logger = new winston.Logger({
…,
transports: [
new winston.transports.Console({
…,
silent: process.argv.indexOf("--silent") >= 0,
}),
],
});
_
ロガーを作成します。
const logger = createLogger({
level: "info",
format: format.json(),
transports: []
});
すべてのロギングを黙らせる:
logger.transports.forEach((t) => (t.silent = true));
私のセットアップは次のとおりです。
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;
セットアップ用のものはうまくいきませんでした。ウィンストン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'}) ]
});
}
これにより、エラーが発生しない限り、すべてのログメッセージが停止します。エラーが発生した場合は、問題のデバッグに役立てたいと考えています。
お役に立てれば。