web-dev-qa-db-fra.com

Node.js - journalisation / Utilisez morgan et winston

nous utilisons morgan pour enregistrer notre transformation express:

var morgan  = require('morgan');
morgan('combined');
// a format string
morgan(':remote-addr :method :url :uuid');
// a custom function
morgan(function (req, res) {
  return req.method + ' ' + req.url + ' ' + req.uuid;
})

De plus, nous utilisons winston afin de journaliser nos autres journalisations:

var winston = require('winston');
var logger = new (winston.Logger)({
  transports: [
         new (winston.transports.Console)({ level: 'info' }),
          new (winston.transports.File)({ filename: '/var/log/log-file.log' })
  ]
});

Est-il possible de combiner les deux enregistreurs? la situation actuelle est que morgan est en écriture sur ma sortie standard, lorsque winston écrit dans /var/log/log-file.log.

Je souhaite que le fichier de journalisation combine les informations de transformation express et les autres informations souhaitées (logger.info()) ..

82
Or Smith

Cet article fait un excellent travail pour ce que vous voulez faire.

http://tostring.it/2014/06/23/advanced-logging-with-nodejs/

Pour votre code spécifique, vous avez probablement besoin de quelque chose comme ça:

var logger = new winston.Logger({
    transports: [
        new winston.transports.File({
            level: 'info',
            filename: './logs/all-logs.log',
            handleExceptions: true,
            json: true,
            maxsize: 5242880, //5MB
            maxFiles: 5,
            colorize: false
        }),
        new winston.transports.Console({
            level: 'debug',
            handleExceptions: true,
            json: false,
            colorize: true
        })
    ],
    exitOnError: false
}),

logger.stream = {
    write: function(message, encoding){
        logger.info(message);
    }
};

app.use(require("morgan")("combined", { "stream": logger.stream }));

Ceci configurera Winston pour écrire un journal sur la console ainsi qu'un fichier. Ensuite, vous pouvez utiliser la dernière expression pour transmettre la sortie du middleware morgan à Winston.

121
lindsaymacvean

Dans TypeScript:

let logger = new (winston.Logger)({
    exitOnError: false,
    level: 'info',
    transports: [
        new (winston.transports.Console)(),
        new (winston.transports.File)({ filename: 'app.log'})
    ]
})

class MyStream {
    write(text: string) {
        logger.info(text)
    }
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));
16
Mahyar SEPEHR

Mettre à jour la dernière ligne pour supprimer l'avertissement

app.use(require("morgan")("combined", { stream: logger.stream }));
7
Johnny

Morgan a la mauvaise habitude de mettre fin au message avec un \n afin de rendre les choses ordonnées, vous voudrez peut-être supprimer cela avant de l'écrire dans winston.

Cela peut être fait de différentes manières, par exemple du côté du format dans winston, ou en mettant à jour votre flux pour ne pas écrire le \n

class MyStream {
    write(text: string) {
        logger.info(text.replace(/\n$/, '');
    }
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));
0
user566245

pour TypeScript une autre façon de s'y prendre, sans avoir besoin de créer une classe est

let logger = new (winston.Logger)({
    exitOnError: false,
    level: 'info',
    transports: [
        new (winston.transports.Console)(),
        new (winston.transports.File)({ filename: 'app.log'})
    ]
})

const myStream = {
    write: (text: string) => {
        logger.info(text)
    }
}

app.use(morgan('combined', { stream: myStream }));

Cette solution provient de cette page Github https://github.com/winstonjs/winston/issues/1385 . Cependant, il est important de noter qu'il existe une légère différence entre nos codes. Au lieu de:

app.use(morgan('combined', { myStream }));

J'utilise:

app.use(morgan('combined', { stream: myStream }));

Cela m’a aidé à ne pas trop créer de cours.

0
Cris Shaki