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


111

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

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

Как пользоваться Морганом?

Ответы:


113

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

Затем я покопался в коде morgan, оказалось, что это не тот тип логгера, он предназначен для автоматической регистрации запросов, ответов и связанных данных. При добавлении в качестве промежуточного программного обеспечения в приложение express / connect по умолчанию оно должно регистрировать операторы в stdout, показывая подробную информацию о: удаленном IP-адресе, методе запроса, версии http, статусе ответа, пользовательском агенте и т. Д. Это позволяет вам изменять журнал с помощью токенов или добавьте к ним цвет, определив «dev» или даже выйдя из потока вывода, например файла.

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

console.log(..);

Или, если вы хотите, чтобы вывод был красивым для объектов:

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

61

Я думаю, у меня есть способ, при котором вы можете не получить именно то, что хотите, но вы можете интегрировать ведение журнала 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);

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


38

Моргана не следует использовать для входа в систему так, как вы описываете. 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'));
}

Обратите внимание на производственную линию, где вы видите morgan, вызываемый с хешем опций {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 для регистрации запросов, то готово.


Что вы посоветуете для такой регистрации?
Ной

Пакет Debug - это то, что вам может понадобиться. Реальная основная идея заключается в том, что вместо использования console.log()вы можете использовать Debug lib в любом месте вашего кода, и вам не нужно беспокоиться об удалении его в производственной среде. github.com/visionmedia/debug
wgp 05

1
я не понимаю ... если в моем приложении NodeJS возникает ошибка, мне не записывать эту ошибку в файл журнала с помощью morgan? или уинстон, или буньян? если нет, то что бы я для этого использовал?
Randy L

2
OP подразумевает, что он хочет использовать Morgan для проверки данных и отладки своего приложения в процессе разработки, что действительно должно выполняться с помощью чего-то вроде модуля Debug. Вы обязательно должны записывать ошибки в производственный файл. Если вы настроите свое приложение, как я предлагаю в своем ответе выше, ошибки будут регистрироваться в файле в производстве и в консоли в разработке. Это проясняет ситуацию?
wgp

17

Я столкнулся с той же проблемой назад и вместо этого использовал 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


Я должен сказать, что для разработчиков, переходящих с языков типа Java на стек MEAN, это сделает их удобными и знакомыми. Спасибо
Jayesh

Можете ли вы сказать мне, как я могу получить доступ к этому файлу журнала, когда мое приложение развернуто, на самом деле я хочу сохранить файл журнала в облачном хранилище, но не могу найти правильный способ
Абхай Сегал

9

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

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

  1. Установите morgan, используя команду ниже:

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 в вашем корневом каталоге, как только пользователь получит доступ к вашему приложению.


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

пример nodejs + экспресс + morgan


4

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

-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 не вызывает проблемы.


Разве также не console.log()записывает на стандартный вывод?
Old Geezer

0

Вы можете попробовать использовать 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": ""
    }

}

0

Использовать morgan довольно просто. Как следует из документации , есть разные способы получить желаемый результат с помощью morgan. Он поставляется с предварительно настроенными методами ведения журнала, или вы можете определить их самостоятельно. Например.

const morgan = require ('морган')

app.use (morgan ('крошечный')

Это даст вам предварительную конфигурацию под названием tiny. Вы заметите в своем терминале, что он делает. В случае, если вас это не устраивает и вы хотите глубже, например, скажем URL-адрес запроса, тогда сюда приходят токены.

morgan.token ('url', function (req, res) {return '/ api / myendpoint'})

затем используйте его так:

app.use (morgan (': url')

Проверьте документацию, там все выделено.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.