web-dev-qa-db-fra.com

Comment utiliser Morgan Logger?

Je ne peux pas me connecter avec Morgan. Il n'enregistre pas les informations sur la console. La documentation ne dit pas comment l'utiliser.

Je veux voir ce qu'est une variable. Ceci est un code du fichier response.js du framework expressjs:

var logger = require("morgan");

res.render = function(view, options, fn){
  options = options || {};
  var self = this;
  var req = this.req;
  var app = req.app;

  // support callback function as second arg
  if ('function' == typeof options) {
    fn = options, options = {};
  }

  // merge res.locals
  options._locals = self.locals;

  // default callback to respond
  fn = fn || function(err, str){
    if (err) return req.next(err);
    self.send(str);
  };

  // Here I want to see what fn is
  // But it doesn't show me anything in console
  // How to use it?
  logger(fn);

  // render
  app.render(view, options, fn);
};

Comment utiliser Morgan?

83
Green

Il semble que vous aussi soyez confus avec la même chose que moi, la raison pour laquelle je suis tombé par hasard sur cette question. Je pense que nous associons la journalisation à la journalisation manuelle, comme nous le ferions en Java avec log4j (si vous connaissez Java) où nous instancions un enregistreur et disons log 'this'.

Ensuite, j’ai fouillé dans morgan code, s’avère que ce n’est pas ce type d’enregistreur, c’est pour la journalisation automatisée des demandes, des réponses et des données connexes. Lorsqu'il est ajouté en tant que middleware à une application express/connect, il doit, par défaut, consigner les instructions sur stdout avec les détails suivants: adresse IP distante, méthode de requête, version http, statut de la réponse, agent utilisateur, etc. Il vous permet de modifier le journal à l'aide de jetons ou. ajoutez-leur de la couleur en définissant 'dev' ou même en vous déconnectant dans un flux de sortie, comme un fichier.

Pour le but que nous pensions pouvoir utiliser, comme dans ce cas, nous devons toujours utiliser:

console.log(..);

Ou si vous voulez rendre la sortie jolie pour les objets:

var util = require("util");
console.log(util.inspect(..));
95
NikhilWanpal

Je pense que j'ai un moyen de ne pas obtenir exactement ce que vous voulez, mais vous pouvez intégrer la journalisation de Morgan à log4js - en d'autres termes, toute votre activité de journalisation peut aller au même endroit. J'espère que ce résumé d'un serveur Express est plus ou moins explicite:

var express = require("express");
var log4js = require("log4js");
var morgan = require("morgan");
...
var theAppLog = log4js.getLogger();
var theHTTPLog = morgan({
  "format": "default",
  "stream": {
    write: function(str) { theAppLog.debug(str); }
  }
});
....
var theServer = express();
theServer.use(theHTTPLog);

Maintenant, vous pouvez écrire ce que vous voulez dans l'AppLog et Morgan écrira ce qu'il veut au même endroit, en utilisant les mêmes appenders, etc. - qui reflète simplement le niveau de consignation que vous souhaitez attribuer à la consignation des demandes/réponses de Morgan.

51
mflo999

Morgan ne doit pas être utilisé pour vous connecter comme vous le décrivez. Morgan a été conçu pour effectuer la journalisation de la même manière que les serveurs comme Apache et Nginx se connectent à error_log ou access_log. Pour référence, voici comment vous utilisez morgan:

var express     = require('express'),
    app         = express(),
    morgan      = require('morgan'); // Require morgan before use

// You can set morgan to log differently depending on your environment
if (app.get('env') == 'production') {
  app.use(morgan('common', { skip: function(req, res) { return res.statusCode < 400 }, stream: __dirname + '/../morgan.log' }));
} else {
  app.use(morgan('dev'));
}

Notez la ligne de production où vous voyez morgan appelé avec un hachage d'options {skip: ..., stream: __dirname + '/../morgan.log'}

La propriété stream de cet objet détermine l'emplacement de sortie du journal. Par défaut, il s’agit de STDOUT (votre console, comme vous le souhaitez), mais il ne consignera que les données de la demande. Il ne va pas faire ce que console.log() fait.

Si vous voulez inspecter des objets à la volée, utilisez la bibliothèque util intégrée:

var util = require('util');
console.log(util.inspect(anyObject)); // Will give you more details than console.log

Donc, la réponse à votre question est que vous posez la mauvaise question. Mais si vous souhaitez toujours utiliser Morgan pour la journalisation des demandes, le tour est joué.

26
Bill

J’ai fait face au même problème il ya un certain temps et j’ai utilisé Winston. Comme indiqué ci-dessus, morgan est destiné à l'enregistrement automatique des requêtes/réponses. Winston peut être configuré à peu près de la même façon que log4Net/log4J, il a des niveaux de gravité, différents flux auxquels vous pouvez vous connecter, etc. 

Par exemple:

npm install winston

Ensuite, si vous appelez le code ci-dessous quelque part lors de l’initialisation de votre application:

var winston = require('winston');

// setup default logger (no category)
winston.loggers.add('default', {
    console: {
        colorize: 'true',
        handleExceptions: true,
        json: false,
        level: 'silly',
        label: 'default',
    },
    file: {
        filename: 'some/path/where/the/log/file/reside/default.log',
        level: 'silly',
        json: false,
        handleExceptions: true,
    },
});

//
// setup logger for category `usersessions`
// you can define as many looggers as you like
//
winston.loggers.add('usersessions', {
    console: {
        level: 'silly',
        colorize: 'true',
        label: 'usersessions',
        json: false,
        handleExceptions: true,
    },
    file: {
        filename: 'some/path/where/the/log/file/reside/usersessions.log',
        level: 'silly',
        json: false,
        handleExceptions: true,
    },
});

remarque: avant d’appeler le code ci-dessus, winston.loggers est vide, c’est-à-dire que vous n’avez pas encore de loggers configurés. Un peu comme les méthodes Log4Net/J XmlConfigure - vous devez d’abord les appeler, pour lancer votre journalisation.

Puis, plus tard, où que vous soyez dans le code côté serveur d'applications, vous pouvez effectuer les tâches suivantes:

var winston = require('winston');
// log instances as defined in first snippet
var defaultLog = winston.loggers.get('default'); 
var userSessionsLog = winston.loggers.get('usersessions');

defaultLog.info('this goes to file default.log');
userSessionsLog.debug('this goes to file usersessions.log')

J'espère que cela pourra aider.

pour toute référence ultérieure dans la documentation: https://www.npmjs.com/package/winston

12
akrsmv
var express = require('express');

var fs = require('fs');

var morgan = require('morgan')

var app = express();

// create a write stream (in append mode)
var accessLogStream = fs.createWriteStream(__dirname + '/access.log',{flags: 'a'});


// setup the logger
app.use(morgan('combined', {stream: accessLogStream}))


app.get('/', function (req, res) {
  res.send('hello, world!')
});

exemple nodejs + express + morgan

8
Carlos Ariza

Vous voudrez peut-être essayer d’utiliser mongo-morgan-ext

L'utilisation est:

var logger = require('mongo-morgan-ext');

var db = 'mongodb://localhost:27017/MyDB';

var collection = 'Logs'

var skipfunction = function(req, res) {

return res.statusCode > 399;
} //Thiw would skip if HTTP request response is less than 399 i.e no errors.

app.use(logger(db,collection,skipfunction)); //In your express-application

La sortie attendue est

{
    "RequestID": "",
    "status": "",
    "method": "",
    "Remote-user": "",
    "Remote-address": "",
    "URL": "",
    "HTTPversion": "",
    "Response-time": "",
    "date":"",
    "Referrer": "",
    "REQUEST": { //10
        "Accept": "",
        "Accept-Charset": "",
        "Accept-Encoding": "",
        "Accept-Language": "",
        "Authorization": "",
        "Cache-Control": "",
        "Connection": "",
        "Cookie": "",
        "Content-Length": "",
        "Content-MD5": "",
        "Content-Type": "",
        "Expect": "",
        "Forwarded": "",
        "From": "",
        "Host": "",
        "Max-Forwards": "",
        "Origin": "",
        "Pragma": "",
        "Proxy-Authorization": "",
        "Range": "",
        "TE": "",
        "User-Agent": "",
        "Via": "",
        "Warning": "",
        "Upgrade": "",
        "Referer": "",
        "Date": "",
        "X-requested-with": "",
        "X-Csrf-Token": "",
        "X-UIDH": "",
        "Proxy-Connection": "",
        "X-Wap-Profile": "",
        "X-ATT-DeviceId": "",
        "X-Http-Method-Override":"",
        "Front-End-Https": "",
        "X-Forwarded-Proto": "",
        "X-Forwarded-Host": "",
        "X-Forwarded-For": "",
        "DNT": "",
        "Accept-Datetime": "",
        "If-Match": "",
        "If-Modified-Since": "",
        "If-None-Match": "",
        "If-Range": "",
        "If-Unmodified-Since": ""
    },
    "RESPONSE": {
        "Status": "",
        "Content-MD5":"",
        "X-Frame-Options": "",
        "Accept-Ranges": "",
        "Age": "",
        "Allow": "",
        "Cache-Control": "",
        "Connection": "",
        "Content-Disposition": "",
        "Content-Encoding": "",
        "Content-Language": "",
        "Content-Length": "",
        "Content-Location": "",
        "Content-Range": "",
        "Content-Type":"",
        "Date":"",
        "Last-Modified": "",
        "Link": "",
        "Location": "",
        "P3P": "",
        "Pragma": "",
        "Proxy-Authenticate": "",
        "Public-Key-Pins": "",
        "Retry-After": "",
        "Server": "",
        "Trailer": "",
        "Transfer-Encoding": "",
        "TSV": "",
        "Upgrade": "",
        "Vary": "",
        "Via": "",
        "Warning": "",
        "WWW-Authenticate": "",
        "Expires": "",
        "Set-Cookie": "",
        "Strict-Transport-Security": "",
        "Refresh":"",
        "Access-Control-Allow-Origin": "",
        "X-XSS-Protection": "",
        "X-WebKit-CSP":"",
        "X-Content-Security-Policy": "",
        "Content-Security-Policy": "",
        "X-Content-Type-Options": "",
        "X-Powered-By": "",
        "X-UA-Compatible": "",
        "X-Content-Duration": "",
        "Upgrade-Insecure-Requests": "",
        "X-Request-ID": "",
        "ETag": "",
        "Accept-Patch": ""
    }

}
0
Gautam Anand

Dans mon cas:

-console.log()  // works
-console.error() // works
-app.use(logger('dev')) // Morgan is NOT logging requests that look like "GET /myURL 304 9.072 ms - -"

CORRECTIF: J'utilisais du code Visual Studio et je devais l'ajouter à ma configuration de lancement

"outputCapture": "std"

Suggestion, si vous utilisez un environnement de développement intégré, exécutez directement à partir de la ligne de commande pour vous assurer que le IDE ne pose pas le problème.

0
Sagan