Winston: 3.0.0では、JSON.stringifyを使用せずにオブジェクトをログに記録することはできません

作成日 2018年02月22日  ·  18コメント  ·  ソース: winstonjs/winston

私はバージョン3を使用していますが、アップグレードしたため、オブジェクトをログに記録する唯一の方法は、最初にオブジェクトを文字列化することです。
しかし、エラーをまったくログに記録できないため、エラーが発生するとさらに悪化します。error.messageを使用するか、コンソールを直接使用する必要があります。

これは、開発環境の構成です。

`` const {createLogger、format、transports} = require( 'winston');
const {combine、timestamp、label、printf} = format;

const environment = process.env.NODE_ENV;
const timestampFormat = 'YYYY-MM-DD HH:mm:SS';

const loggerFormat = printf((info) => {
    return `[${info.label}] ${info.message}`;
});
logger = createLogger({
    format: combine(
        label({ label: 'immoliste' }),
        format.colorize({ all: true }),
        format.splat(),
        format.simple(),
        loggerFormat
    ),
    transports: [
        new transports.Console({
            level: 'debug',
            colorized: true
        })
    ]
});

これを行う:

logger.error('Error sending contact message:', JSON.stringify(err));

私が得たのは:

[mylabel] Error sending contact message:

しかし、すべてを文字列化する必要があるお尻の痛みであり、エラーのためにそれを行います。 以前のバージョンでは簡単だったので、私は何が間違っていますか?

最も参考になるコメント

真剣に、これはダウングレードのようです。 Winston 2では、すべてのconsole.Xwinston.Xに置き換えることができます。 なぜ突然醜いフォーマットのタグなのか?

全てのコメント18件

+1

@eypこれを試すことができますか?

logger.error('Error sending contact message:%o', {foo: "bar"});

基になるソースはここにあります:

https://github.com/winstonjs/logform/blob/master/splat.js

ノードからutil.formatを使用していることがわかります

https://nodejs.org/api/util.html#util_util_format_format_args

したがって、 %o%O 、および%jがその役割を果たします

%o

チャームのように機能します。winstonがutil.formatと同じフォーマットパラメータを使用していることを知りませんでした。

ありがとう!

ウィンストン3.1.0
私はここに書くようにこれを試します:
const debugConsole = new winston.transports.Console({
レベル: 'デバッグ'、
フォーマット:winston.format.combine(winston.format.simple())、
handleExceptions:true
})
logger.add(debugConsole)

私が使用するコードでは、logger.debug( '%o'、req.query)
jsonオブジェクトが表示されますが、前に「%o」も表示されます。コンソールログは次のとおりです。
デバッグ:%o {"offset": "73000"、 "count": "3"、 "timestamp": "2018-10-29 15:02:08"}
私は何を着ていますか?

通常、%oはutil.format()によって呼び出され、そこで必要なオブジェクトを指定します。 出力からは、オブジェクトが表示されているため、%oも必要ないように見えます。

代わりに、logger.debug(req.query)を使用すると、機能するはずです。 または、次のようなutil.formatを使用して変数に格納できます。
const queryFormatted = util.format( '%o'、req.query)
logger.debug(queryFormatted)

@frenzymindまたは、@ mingchunoによって元の問題に投稿された回避策を試してください。

代わりに、logger.debug(req.query)を使用すると、機能するはずです。

@eponymzこの場合、次のようになります。debug:[object Object] {"timestamp": "2018-10-30 11:14:04"}

const queryFormatted = util.format( '%o'、req.query)

動作しますが、うるさいです。

2番目からの出力はあなたが望んでいたものですか? つまり、ログにクエリが必要な場合は、それが表示されているということです。 そうでない場合は、その明中野が投稿する前に言及された回避策を試してください。

はい、2番目の方法は私が望むように機能します。 jsonオブジェクトデータが表示されます。
私が正しく理解している場合、mingchunoは文字列で%oを使用するようにアドバイスしました。これは、winstonが「内部」でutilを使用するためです。 試してみましたが、私の場合は%oも出力されます。 また、デバッグレベルにsplat()形式を追加しましたが、何も変更されていません。 私は何かが恋しいですか?

はい、オブジェクト検査の前に%oが追加されています。 それはある種のバグだと思いますか?

それは意図的な設計上の選択ですか? 代わりに、標準からかなり逸脱しています(そして見つけるのにかなりの時間がかかりました)

console.log('Log me plz: ', {'ok': 'logged'});

(winston 3.x)すべてのロギング呼び出しをに変更する必要があります

logger.info('Log me plz: %o', {'ok':'logged'});

すみません、私は正しいですか? 私は混乱しています...

真剣に、これはダウングレードのようです。 Winston 2では、すべてのconsole.Xwinston.Xに置き換えることができます。 なぜ突然醜いフォーマットのタグなのか?

したがって、修正は、オブジェクトを出力するすべてのロギングステートメントに%oを追加することですか?

はい!

私が常に%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
}

私があなたたちを助けることができることを願っています:D私たちがいつも「%o」を2回使用した場合はひどいです

私が常に%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
}

私があなたたちを助けることができることを願っています:D私たちがいつも「%o」を2回使用した場合はひどいです

いいですね、でも変です。すべてのロガーレベルでそれを行う必要がありますか?

情報のためだけに、使用する方が良いです
`` `javascript
typeof info.message === 'オブジェクト'
`` ``
それ以外の

`` `javascript
info.message.constructor ===オブジェクト
`` ``
メッセージがnullまたは未定義の場合のエラーを回避し、配列が正しく表示されます
(例:[{hi: "456"}]

このページは役に立ちましたか?
0 / 5 - 0 評価