Як користуватися реєстратором Morgan?


109

Я не можу ввійти з Морганом. Він не записує інформацію до консолі. У документації не вказано, як ним користуватися.

Я хочу побачити, що таке змінна. Це код з response.jsфайлу 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);
};

Як користуватися Morgan?

Відповіді:


111

Здається, ви теж плутаєте те саме, що і я, з якої причини я натрапив на це питання. Я думаю, що ми пов'язуємо ведення журналу з ручним веденням журналу, як це робимо в Java з log4j (якщо ви знаєте Java), де ми інстанціюємо Logger і кажемо log 'this'.

Тоді я перекопав код morgan, виявляється, це не той тип реєстратора, це автоматизований журнал запитів, відповідей та пов’язаних даних. Якщо додано як проміжне програмне забезпечення до програми експрес-підключення, за замовчуванням він повинен записувати заяви до stdout, де відображаються деталі: віддалений ip, метод запиту, версія http, статус відповіді, агент користувача тощо. Це дозволяє змінювати журнал за допомогою лексем або додайте до них колір, визначивши «dev» або навіть вийшовши із системи у вихідний потік, як у файл.

З тією метою, яку ми думали, ми можемо використовувати, як і в цьому випадку, ми все ще повинні використовувати:

console.log(..);

Або якщо ви хочете зробити висновок гарним для об'єктів:

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

60

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

Тепер ви можете написати що завгодно theAppLog, і Морган напише все, що хоче в те саме місце, використовуючи ті самі додатки тощо тощо. Звичайно, ви можете зателефонувати на інформацію () або все, що завгодно, в обгортку потоку замість налагодження () - це просто відображає рівень реєстрації, який ви хочете надати запиту Моргана на запит запитів / res.


38

Морган не повинен використовуватися для входу в спосіб, який ви описуєте. Морган був створений для ведення журналу таким чином, щоб такі сервери, як Apache та Nginx, входили до журналу error_log або access_log. Для довідки, ви використовуєте морган:

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 для реєстрації запитів, ви йдете.


Що ви рекомендуєте для такого типу лісозаготівлі?
Ной

Пакет налагодження - це те, що ви можете хотіти. Справжня основна ідея полягає в тому, що замість використання console.log()ви можете використовувати вкладку Debug де-небудь у своєму коді, і вам не потрібно турбуватися про видалення її у виробництві. github.com/visionmedia/debug
wgp

1
я не розумію ... якщо в моєму додатку NodeJS сталася помилка, я не повинен записувати цю помилку в лог-файл за допомогою morgan? або Вінстон, або Баньян? як ні, то що б я використав для цього?
Ранді Л

2
ОП означало, що він хоче використовувати Моргана для перевірки даних та налагодження свого додатка в розробці, що дійсно повинно бути зроблено з чимось на зразок модуля налагодження. Ви абсолютно повинні записати помилки у файл у виробництві. Якщо ви налаштуєте додаток, як я пропоную у своїй відповіді вище, помилки потрапляють у файл у виробництві та на консоль у розробці. Чи це зрозуміло?
wgp

17

Я зіткнувся з тією ж проблемою тому, і замість цього я використав Вінстон. Як сказано вище, morgan призначений для автоматизованого реєстрації запиту / відповіді. Вінстон може бути налаштований приблизно так само, як 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 - це проміжне програмне забезпечення, яке допоможе нам визначити клієнтів, які звертаються до нашої програми. В основному лісоруб.

Щоб використовувати 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 для вашого кореня, коли користувач отримає доступ до вашої програми.


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 + express + 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()пише також на стандартний вихід?
Старий

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

Використання моргану досить просто. Як свідчить документація , існують різні способи отримати бажаний вихід за допомогою моргана. Він постачається з попередньо налаштованими методами ведення журналу, або ви можете визначити їх самостійно. Напр.

const morgan = вимагати ('morgan')

app.use (morgan ('крихітний')

Це дасть вам попередню конфігурацію, яку називають крихітною. Ви помітите у своєму терміналі, що це робить. Якщо вас це не влаштовує і ви хочете глибше, наприклад, скажіть URL-адресу запиту, то тут надходять жетони.

morgan.token ('url', функція (req, res) {return '/ api / myendpoint'})

то використовуйте його так:

app.use (morgan (': url')

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.