web-dev-qa-db-ja.com

Winstonロギングオブジェクト

Winstonをバックエンドのロギングに使用しています。JSON.stringifyを使用しないとオブジェクトをログに記録できません。

logger.debug(`Register ${JSON.stringify(req.body)}`)
const logger: Logger = createLogger({
    // change level if in dev environment versus production
    level: env === 'production' ? 'info' : 'debug',
    format: format.combine(
        format.label({label: path.basename(process.mainModule.filename)}),
        format.timestamp({format: 'YYYY-MM-DD HH:mm:ss'}),
        format.prettyPrint()
    ),
    transports: [
        new transports.Console({
            format: format.combine(format.colorize(), logFormat),
        }),
        new transports.File({
            filename,
            format: format.combine(format.json()),
        }),
    ],
    exitOnError: false,
})

Winstonでオブジェクトをログに記録する方法を教えてください。バージョン3.2.1を使用しています

4
coinhndp

@SherloxFRと@Antonが提供するソリューションを組み合わせる必要がありました。

_const Winston = require('winston');
const { format } = Winston;

const options = {
    file: {
        ....
        format: format.combine(
            format.splat(), 
            format.json()
        ),
        ...
    },
    console: {
        ...
        format: format.combine(
            format.splat(),
            format.json()
        ),
        ...
    }
};
_

上記のコードのオプション設定にformat.splat()format.json()の両方を追加したことがわかります。

_const logger = new Winston.createLogger({
    transports: [
        new Winston.transports.File(options.file),
        new Winston.transports.Console(options.console)
    ],
    exitOnError: false // do not exit on handled exceptions
});
_

このようにして、オプション構成オブジェクトを使用しました。トランスポート配列内にフォーマットコードを実際に書き込むことができますが、私はそのように好きではありません。とにかくそれはあなたの選択です。

そのような構成の後、これが私のコードでの使用方法です

_let myObj = {
   name: "StackOverflow",
};

logger.info('Content: %o', myObj);
_

必要に応じて、このように広げることもできます

_logger.info('Content: %o', {...myObj});
_

それで全部です。 Winstonはこの設定でオブジェクトをログに記録する必要があります。

1
SirPhemmiey