Как использовать регистратор Morgan?

Я не могу войти в систему с Морганом. Он не записывает информацию в консоль. В документации не указано, как ее использовать.

Я хочу посмотреть, что такое переменная. Это код из файла response.js рамки 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);
};

Как использовать Morgan?

Ответ 1

Кажется, вас тоже путают с тем же, что и я, поэтому я наткнулся на этот вопрос. Я думаю, что мы связываем ведение журнала с ручным протоколированием, как это было бы в Java с log4j (если вы знаете java), где мы создаем экземпляр Logger и говорим журнал 'this'.

Затем я выкопал код Morgan, оказывается, что это не тот тип регистратора, он предназначен для автоматического ведения запросов, ответов и связанных с ними данных. При добавлении в качестве промежуточного программного обеспечения для приложения express/connect по умолчанию ему необходимо записывать операторы в stdout, где указаны детали: удаленный ip, метод запроса, версия http, статус ответа, пользовательский агент и т.д. Он позволяет вам изменять журнал с помощью токенов или добавьте цвет к ним, указав "dev" или даже выполнив вход в выходной поток, например файл.

Для этой цели мы решили использовать ее, так как в этом случае нам все равно придется использовать:

console.log(..);

Или если вы хотите сделать вывод симпатичным для объектов:

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

Ответ 2

Я думаю, что у меня есть способ, которым вы не можете получить то, что хотите, но вы можете интегрировать журнал Morgan с log4js - другими словами, вся ваша деятельность по регистрации может идти в одно и то же место. Я надеюсь, что этот дайджест с Express-сервера более или менее понятен:

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

Теперь вы можете писать все, что хотите, в AppLog, и Morgan будет писать то, что он хочет, в том же месте, используя те же приложения и т.д. и т.д. Конечно, вы можете вызвать info() или все, что вам нравится в обертке потока, а не debug() - это просто отражает уровень ведения журнала, который вы хотите предоставить журналу Morgan req/res.

Ответ 3

Морган не должен использоваться для регистрации того, как вы описываете. Morgan был создан для ведения журнала таким образом, что серверы, такие как Apache и Nginx, регистрируются в error_log или access_log. Для справки, так вы используете 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'));
}

Обратите внимание на производственную линию, в которой вы видите морган с параметром хэш {skip: ..., stream: __dirname + '/../morgan.log'}

Свойство stream этого объекта определяет, где выдается регистратор. По умолчанию это STDOUT (ваша консоль, как и вы хотите), но она будет регистрировать только данные запроса. Он не собирается делать то, что делает console.log().

Если вы хотите осмотреть вещи "на лету", используйте встроенную библиотеку util:

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

Итак, ответ на ваш вопрос заключается в том, что вы задаете неправильный вопрос. Но если вы все еще хотите использовать Morgan для регистрации запросов, вы идете.

Ответ 4

Я столкнулся с той же проблемой, и вместо этого я использовал winston. Как указано выше, morgan предназначен для автоматической регистрации запроса/ответа. Winston можно настроить так же, как log4Net/log4J, имеет уровни серьезности, различные потоки, к которым вы можете записывать и т.д.

Например:

npm install winston

Затем, если вы вызываете код ниже где-то при инициализации приложения:

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

обратите внимание: перед вызовом кода выше winston.loggers пуст, т.е. у вас еще нет настроенных журналов. В значительной степени, как методы Log4Net/J XmlConfigure - вам нужно сначала вызвать их, чтобы начать регистрацию.

Затем, позже, где бы вы ни делали код на стороне сервера приложений, вы можете:

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

Надеюсь, что это поможет.

для дополнительной документации: https://www.npmjs.com/package/winston

Ответ 5

Морган: - Морган - это промежуточное ПО, которое поможет нам идентифицировать клиентов, которые обращаются к нашему приложению. В основном это регистратор.

Чтобы использовать Morgan, нам нужно выполнить следующие шаги: -

  1. Установите Морган, используя следующую команду:

npm install --save morgan

Это добавит morgan в файл json.package

  1. Включите Морган в ваш проект

var morgan = require('morgan');

3>//создаем поток записи (в режиме добавления)

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

Примечание: убедитесь, что вы не отвлекаетесь сверху, убедитесь, что у вас есть все условия, где вам нужно.

Выше автоматически создаст файл access.log для вашего root, как только пользователь получит доступ к вашему приложению.

Ответ 6

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

example nodejs + express + morgan

Ответ 7

Возможно, вы захотите использовать mongo-morgan-ext

Использование:

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

Ожидаемый результат:

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

}

Ответ 8

В моем случае:

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

ИСПРАВЛЕНИЕ: я использовал код Visual Studio, и мне пришлось добавить его в мою конфигурацию запуска

"outputCapture": "std"

Если вы работаете в среде IDE, запустите ее непосредственно из командной строки, чтобы убедиться, что среда IDE не вызывает проблемы.