Maison  >  Article  >  interface Web  >  Résumé de l'utilisation du module de journalisation nodejs Winston

Résumé de l'utilisation du module de journalisation nodejs Winston

php中世界最好的语言
php中世界最好的语言original
2018-05-14 13:59:543691parcourir

Cette fois, je vais vous apporter un résumé de la façon d'utiliser le module de journal nodejs winston. Quelles sont les précautions lors de l'utilisation du module de journal nodejs winston. Ce qui suit est un cas pratique, jetons un coup d'œil. .

Module de journal Winston

Lorsque vous utilisez le module Winston de nodejs, plus les deux modules associés, vous pouvez obtenir deux fois le résultat avec la moitié de l'effort.

  1. express-winston

  2. winston-daily-rotate-file

express -winston

est une version améliorée de winston d'express-winston. Il est utilisé comme middleware d'express pour imprimer les journaux, non seulement avec les informations d'en-tête de demande, mais également avec le temps de réponse.
En tant que middleware, pourquoi y a-t-il un temps de réponse ? Étant donné qu'express-winston a réécrit la méthode res.end d'express, le journal est généré une fois la requête terminée.

Extrait de code

var end = res.end;
res.end = function(chunk, encoding) {
 res.responseTime = (new Date) - req._startTime;
 res.end = end;
 res.end(chunk, encoding);
 ...
 }

express-winston ne modifie ni n'étend le transport de Winston, et winston-daily-rotate-file améliore simplement la méthode de transport de Winston

winston-daily-rotate-file

winston-daily-rotate-file est une extension de Winston, qui ajoute une méthode de transport pour donner à Winston la possibilité de faire rouler des journaux.

Utilisé en conjonction avec

, nous avons une exigence : Comment faire en sorte qu'express-winston imprime le journal et également les paramètres de requête de l'interface /api et données de réponse ?

  1. Le middleware de journalisation doit être derrière l'API de la chaîne d'appels et avant le traitement commercial api/*. comme : app.use('/api', apiRequestLogger, apiHandler)

  2. Pour obtenir les données de réponse, vous devez les envoyer une fois l'entreprise traitée avant qu'elle puisse être capturée. All express La réponse finale à la demande est res.send. Nous pouvons commencer à capturer les données de réponse à partir d'ici

Le code est le suivant

import winston from 'winston'
import expressWinston from 'express-winston'
import 'winston-daily-rotate-file'
import path from 'path'
export let DailyRotateFileTransport = (fileName) => {
 return new (winston.transports.DailyRotateFile)({
 filename: path.join(process.env.LOGPATH, `${fileName}-%DATE%.log`),
 datePattern: 'YYYY-MM-DD-HH',
 // maxSize: '20m',
 maxFiles: '7d',
 timestamp: () => new Date().format('yyyy-MM-dd hh:mm:ss.S')
 })
}
export let pageRequestLogger = expressWinston.logger({
 transports: [
 DailyRotateFileTransport('page-request')
 ],
 meta: true, // optional: control whether you want to log the meta data about the request (default to true)
 msg: 'HTTP {{req.method}} {{req.url}}', // optional: customize the default logging message. E.g. "{{res.statusCode}} {{req.method}} {{res.responseTime}}ms {{req.url}}"
 expressFormat: true, // Use the default Express/morgan request formatting. Enabling this will override any msg if true. Will only output colors with colorize set to true
 colorize: false, // Color the text and status code, using the Express/morgan color palette (text: gray, status: default green, 3XX cyan, 4XX yellow, 5XX red).
 ignoreRoute: function (req, res) {
 // 只打印页面请求信息
 let notPageRequest = false
 let ignoreArr = ['/api', '.js', '.css', '.png', '.jpg', '.gif']
 ignoreArr.forEach(item => {
  if (req.url.indexOf(item) > -1) notPageRequest = true
 })
 return notPageRequest
 } // optional: allows to skip some log messages based on request and/or response
})
export let apiRequestLogger = (req, res, next) => {
 let send = res.send
 let content = ''
 let query = req.query || {}
 let body = req.body || {}
 res.send = function () {
 content = arguments[0]
 send.apply(res, arguments)
 }
 expressWinston.logger({
 transports: [
  DailyRotateFileTransport('api-request')
 ],
 meta: true, // optional: control whether you want to log the meta data about the request (default to true)
 msg () {
  return `HTTP ${req.method} ${req.url} query ${JSON.stringify(query)} body ${JSON.stringify(body)} resData ${content} `
 },
 colorize: true, // Color the text and status code, using the Express/morgan color palette (text: gray, status: default green, 3XX cyan, 4XX yellow, 5XX red).
 ignoreRoute: function (req, res) {
  if (req.headers.self) return true
  return false
 } // optional: allows to skip some log messages based on request and/or response
 })(req, res, next)
}

Je vous crois. J'ai maîtrisé la méthode après avoir lu le cas dans cet article , pour un contenu plus passionnant, veuillez faire attention aux autres articles connexes sur le site Web chinois de php !

Lecture recommandée :

Explication détaillée des étapes pour contrôler les autorisations de routage avec React Router4+redux

Explication détaillée de les avantages et les inconvénients de l'utilisation de Webpack path et publicPath

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn