web-dev-qa-db-fra.com

Objet de journalisation Winston

J'utilise Winston pour la journalisation de mon backend Je ne peux pas enregistrer l'objet sans utiliser JSON.stringify ce qui est ennuyeux

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,
})

Pourriez-vous me montrer comment enregistrer un objet avec Winston. J'utilise la version 3.2.1

4
coinhndp

J'ai dû combiner la solution fournie par @SherloxFR et @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()
        ),
        ...
    }
};

Vous pouvez voir que j'ai ajouté à la fois format.splat() et format.json() à la configuration des options dans le code ci-dessus.

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
});

C'est ainsi que j'ai utilisé l'objet de configuration d'options. Vous pouvez réellement écrire le code de format à l'intérieur du tableau des transports mais je ne l'aime pas de cette façon. C'est votre choix de toute façon.

Après la configuration comme ça, c'est comme ça que je l'ai utilisé dans mon code

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

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

Vous pouvez également le diffuser comme ceci si vous le souhaitez

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

C'est tout. Winston devrait enregistrer votre objet avec cette configuration.

1
SirPhemmiey