私はバージョン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:
しかし、すべてを文字列化する必要があるお尻の痛みであり、エラーのためにそれを行います。 以前のバージョンでは簡単だったので、私は何が間違っていますか?
+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.X
をwinston.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"}]
最も参考になるコメント
真剣に、これはダウングレードのようです。 Winston 2では、すべての
console.X
をwinston.X
に置き換えることができます。 なぜ突然醜いフォーマットのタグなのか?