トップNodeロギングシステム:npmlog
、log4js
、bunyan
およびwinston
を見て、winston
を使用することにしました。 npm
の月間ダウンロード数が最も多いため。
私がセットアップしたいのは、プロダクション環境では何も記録しないlogger.debug(...)
を使用して開発環境で使用できるカスタムロガーです。これは私を助けてくれるので、開発環境にいるときは、すべての出力が表示されるので、何も書く必要はありません。
これは私が今持っているものです:
var level = 'debug';
if (process.env.NODE_ENV !== 'development'){
level = 'production'; // this will never be logged!
}
var logger = new winston.Logger({
transports: [
// some other loggings
new winston.transports.Console({
name: 'debug-console',
level: level,
prettyPrint: true,
handleExceptions: true,
json: false,
colorize: true
})
],
exitOnError: false // don't crush no error
});
JavaScript Object
またはJavascript Array
を記録しようとすると問題が発生します。 Object
の場合、toJSON()
を実行する必要があり、Array
の場合、最初にJSON.stringify()
を、次にJSON.parse()
を必要とします。
私が欲しいものを記録するためだけに、このメソッドを常に書くのは良いことではありません。さらに、logger.debug()
が本番環境であり、最初にログを記録してはならないことを認識する前に、これらのフォーマットメソッドを実行する必要があるため、リソースフレンドリーでもありません(基本的に、関数呼び出しの前に引数を評価します)。昔ながらのconsole.log()
がJavaScriptオブジェクトと配列を記録する方法が好きです。
さて、この質問を書いているときに、すべてのウィンストンtransports
オブジェクトに対して カスタム形式 を記述する方法があることがわかりました。それはそれを行う方法ですか、それとも他の方法がありますか?
prettyPrintパラメーターを変更してみてください
prettyPrint: function ( object ){
return JSON.stringify(object);
}
logger.log("info", "Starting up with config %j", config);
Winstonsは組み込みのutils.formatライブラリを使用します。 https://nodejs.org/dist/latest/docs/api/util.html#util_util_format_format_args
Winston> 3では、使用できます
logger.log('%o', { lol: 123 }')
とにかく...私は常に%oを使用しなければならないことを受け入れられず、この簡単な解決策を作りました:
const prettyJson = format.printf(info => {
if (info.message.constructor === Object) {
info.message = JSON.stringify(info.message, null, 4)
}
return `${info.level}: ${info.message}`
})
const logger = createLogger({
level: 'info',
format: format.combine(
format.colorize(),
format.prettyPrint(),
format.splat(),
format.simple(),
prettyJson,
),
transports: [
new transports.Console({})
],
})
このロガー...
logger.info({ hi: 123 })
...コンソールでこれに変換します
info: {
"hi": 123
}
組み込みのNode.js関数util.format
を使用して、console.log
と同じ方法でオブジェクトを文字列に変換します。
私の推奨事項は、デバッグ用にオブジェクトを印刷する便利な方法があるウィンストンの上に独自の抽象化を書くことです。
メソッドの開発方法のヒントについては、この応答を参照することもできます。
する代わりに
prettyPrint: function ( object ){
return JSON.stringify(object)
}
tils-deep-clone packageを使用することをお勧めします
// initialize package on the top
const { toJSON } = require('utils-deep-clone')
// and now in your `prettyPrint` parameter do this
prettyPrint: function ( object ){
return toJSON(object)
}
JSON.stringify
エラーを印刷することはできません
console.log(JSON.stringify(new Error('some error')))
// output will '{}'