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()
) ..
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.
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 }));
Mettre à jour la dernière ligne pour supprimer l'avertissement
app.use(require("morgan")("combined", { stream: logger.stream }));
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 }));
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.