web-dev-qa-db-ja.com

console.logのようにwinstonでJavaScriptオブジェクトと配列を記録する方法は?

トップNodeロギングシステム:npmloglog4jsbunyanおよび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オブジェクトに対して カスタム形式 を記述する方法があることがわかりました。それはそれを行う方法ですか、それとも他の方法がありますか?

28
Tommz

prettyPrintパラメーターを変更してみてください

prettyPrint: function ( object ){
    return JSON.stringify(object);
}
15
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

25
Leo

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
}
4
smith64fx

組み込みのNode.js関数util.formatを使用して、console.logと同じ方法でオブジェクトを文字列に変換します。

4

私の推奨事項は、デバッグ用にオブジェクトを印刷する便利な方法があるウィンストンの上に独自の抽象化を書くことです。

メソッドの開発方法のヒントについては、この応答を参照することもできます。

https://stackoverflow.com/a/12620543/221174

2
ambrons

する代わりに

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 '{}'
0
Atishay Jain