it-swarm.com.de

Wie benutze ich Morgan Logger?

Ich kann mich nicht bei Morgan einloggen. Es protokolliert keine Informationen auf der Konsole. Die Dokumentation sagt nicht aus, wie man es benutzt.

Ich möchte sehen, was eine Variable ist. Dies ist ein Code aus der response.js-Datei von expressjs framework:

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

Wie benutze ich Morgan?

83
Green

Anscheinend sind auch Sie mit dem gleichen verwirrt wie ich, weshalb ich über diese Frage gestolpert bin. Ich denke, wir verbinden die Protokollierung mit der manuellen Protokollierung, wie wir es in Java mit log4j tun würden (wenn Sie Java kennen), wo wir einen Logger instanziieren und sagen, log 'this'.

Dann habe ich in morgan-Code gegraben, stellt sich heraus, dass es sich nicht um einen Logger handelt, sondern um automatisierte Protokollierung von Anforderungen, Antworten und zugehörigen Daten. Wenn sie einer Express-/Connect-App als Middleware hinzugefügt wird, sollte sie standardmäßig Anweisungen in stdout protokollieren, die Details zu: Remote-IP, Anfragemethode, http-Version, Antwortstatus, Benutzeragent usw. anzeigen. Sie können das Protokoll mithilfe von Tokens oder ändern Fügen Sie Farbe hinzu, indem Sie "dev" definieren oder sich bei einem Ausgabestrom wie einer Datei abmelden.

Zu dem Zweck, von dem wir dachten, dass wir ihn verwenden können, müssen wir in diesem Fall noch Folgendes verwenden:

console.log(..);

Oder wenn Sie die Ausgabe für Objekte schön gestalten wollen:

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

Ich denke, ich habe einen Weg, auf dem Sie nicht genau das bekommen, was Sie wollen, aber Sie können Morgans Protokollierung mit log4js integrieren - mit anderen Worten, alle Ihre Protokollierungsaktivitäten können an dieselbe Stelle gehen. Ich hoffe, dass dieser Digest von einem Express-Server mehr oder weniger selbsterklärend ist:

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

Jetzt können Sie dem AppLog alles schreiben, was Sie möchten, und Morgan wird schreiben, was er möchte, und zwar mit den gleichen Appendern usw. usw. Natürlich können Sie info () oder was auch immer Sie möchten im Stream-Wrapper statt debug () aufrufen - Dies spiegelt nur die Protokollierungsstufe wider, die Sie der req/res-Protokollierung von Morgan zuweisen möchten.

51
mflo999

Morgan sollte nicht dazu benutzt werden, sich auf die Art und Weise anzumelden, die Sie beschreiben. Morgan wurde für die Protokollierung von Servern wie Apache und Nginx im error_log oder access_log entwickelt. Als Referenz verwenden Sie 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'));
}

Beachten Sie die Produktionslinie, in der morgan mit einem Optionshash aufgerufen wird. {skip: ..., stream: __dirname + '/../morgan.log'}

Die stream-Eigenschaft dieses Objekts bestimmt, wo der Logger ausgegeben wird. Standardmäßig ist dies STDOUT (Ihre Konsole, wie Sie möchten), aber es werden nur Anforderungsdaten protokolliert. Es wird nicht das tun, was console.log() tut.

Wenn Sie die Dinge im Handumdrehen untersuchen möchten, verwenden Sie die integrierte util-Bibliothek:

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

Die Antwort auf Ihre Frage ist also, dass Sie die falsche Frage stellen. Wenn Sie Morgan dennoch zum Protokollieren von Anforderungen verwenden möchten, können Sie dies tun.

26
Bill

Ich stand vor demselben Problem und habe stattdessen Winston verwendet. Wie bereits erwähnt, dient morgan der automatisierten Protokollierung der Anfrage/Antwort. Winston kann auf die gleiche Weise wie log4Net/log4J konfiguriert werden, hat Schweregrade, verschiedene Streams, in die Sie sich einloggen können usw. 

Zum Beispiel:

npm install winston

Wenn Sie den Code unten in Ihrer Anwendungsinitialisierung aufrufen,

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

hinweis: Vor dem Aufruf des obigen Codes ist winston.loggers leer, d. h. Sie haben noch keine Logger konfiguriert. Ähnlich wie die Log4Net/J XmlConfigure-Methoden - Sie müssen sie zuerst aufrufen, um die Protokollierung zu starten.

Später dann, wo immer Sie sich in Ihrem Anwendungsserver-Code befinden, können Sie Folgendes tun:

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')

Hoffentlich hilft das.

weitere Dokumentationsreferenzen: 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!')
});

beispiel nodejs + express + morgan

8
Carlos Ariza

Morgan: - Morgan ist eine Middleware, mit deren Hilfe wir die Kunden identifizieren können, die auf unsere Anwendung zugreifen. Grundsätzlich ein Logger.

Um Morgan zu benutzen, müssen wir die folgenden Schritte ausführen:

  1. Installieren Sie das Morgan mit dem folgenden Befehl:

npm install --save morgan

Dadurch wird morgan zur Datei json.package hinzugefügt

  1. Binden Sie das Morgan in Ihr Projekt ein

var morgan = require('morgan');

3> // einen Write Stream erstellen (im Append-Modus)

var accessLogStream = fs.createWriteStream(
      path.join(__dirname, 'access.log'), {flags: 'a'}
 );
// setup the logger 
app.use(morgan('combined', {stream: accessLogStream}));

Hinweis: Stellen Sie sicher, dass Sie nicht blindlings darüber loten. Stellen Sie sicher, dass Sie alle Bedingungen haben, die Sie benötigen.

Oben wird automatisch eine access.log-Datei für Ihren Root erstellt, sobald der Benutzer auf Ihre App zugreift.

8
Sunil Verma

Möglicherweise möchten Sie versuchen, mongo-morgan-ext zu verwenden.

Die Verwendung ist:

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

Die erwartete Ausgabe ist

{
    "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

In meinem Fall:

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

UPDATE: Ich verwendete Visual Studio-Code und musste diesen zu meiner Startkonfiguration hinzufügen

"outputCapture": "std"

Hinweis: Wenn Sie eine IDE verwenden, führen Sie diese direkt über die Befehlszeile aus, um sicherzustellen, dass IDE das Problem nicht verursacht.

0
Sagan