Morgan logger nasıl kullanılır?


109

Morgan ile oturum açamıyorum. Konsola bilgi kaydetmez. Belgeler, nasıl kullanılacağını söylemiyor.

Değişkenin ne olduğunu görmek istiyorum. Bu, response.jsexpressjs çerçevesi dosyasından bir koddur :

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 nasıl kullanılır?

Yanıtlar:


112

Görünüşe göre siz de benimle aynı şeyle kafanız karıştı, bu soruya rastlamamın nedeni. Sanırım günlüğü manuel günlüğe kaydetme ile ilişkilendirdiğimizi, bir Logger'ı başlattığımız ve log 'this' dediğimiz log4j ile (java biliyorsanız) Java'da yaptığımız gibi ilişkilendiriyoruz.

Sonra morgan kodunu kazdım, o tür bir kaydedici olmadığı ortaya çıktı, isteklerin, yanıtların ve ilgili verilerin otomatik olarak günlüğe kaydedilmesi için. Bir ekspres / bağlantı uygulamasına bir ara yazılım olarak eklendiğinde, varsayılan olarak, ifadeleri stdout'a günlüğe kaydetmelidir: uzak ip, istek yöntemi, http sürümü, yanıt durumu, kullanıcı aracısı vb. 'dev' tanımlayarak veya hatta bir dosya gibi bir çıktı akışından çıkış yaparak onlara renk katın.

Kullanabileceğimizi düşündüğümüz amaç için, bu durumda olduğu gibi, yine de kullanmak zorundayız:

console.log(..);

Veya çıktıyı nesneler için güzel yapmak istiyorsanız:

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

60

Sanırım tam olarak istediğinizi elde edemeyeceğiniz bir yol var, ancak Morgan'ın günlük kaydını log4js ile entegre edebilirsiniz - başka bir deyişle, tüm kayıt faaliyetleriniz aynı yere gidebilir. Umarım bir Express sunucusundan alınan bu özet aşağı yukarı kendinden açıklamalıdır:

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

Artık AppLog'a istediğinizi yazabilirsiniz ve Morgan aynı ekleri vb. Kullanarak istediğini aynı yere yazacaktır. Elbette debug () yerine akış sarmalayıcıda info () veya istediğiniz her şeyi çağırabilirsiniz. - bu sadece Morgan'ın req / res günlüklerine vermek istediğiniz kayıt seviyesini yansıtır.


38

Morgan, tarif ettiğiniz şekilde oturum açmak için kullanılmamalıdır. Morgan, Apache ve Nginx gibi sunucuların error_log veya access_log'da oturum açacağı şekilde günlük kaydı yapmak için oluşturuldu. Referans olarak, morgan'ı şu şekilde kullanıyorsunuz:

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'ın seçenekler karması ile çağrıldığını gördüğünüz üretim hattına dikkat edin {skip: ..., stream: __dirname + '/../morgan.log'}

Bu streamnesnenin özelliği, kaydedicinin çıktıyı nerede çıkaracağını belirler. Varsayılan olarak STDOUT'tur (tıpkı istediğiniz gibi konsolunuz) ancak yalnızca istek verilerini günlüğe kaydeder. Ne yapacağını yapmayacak console.log().

Bir şeyleri anında incelemek istiyorsanız, yerleşik utilkitaplığı kullanın :

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

Yani sorunuzun cevabı, yanlış soruyu sormanızdır. Ama yine de Morgan'ı günlük talepleri için kullanmak istiyorsanız, işte buradasınız.


Bu tür bir kayıt için ne önerirsiniz?
Noah

Debug paketi isteyebileceğiniz şeydir. Gerçek temel fikir, console.log()Debug kütüphanesini kullanmak yerine kodunuzun herhangi bir yerinde kullanabilirsiniz ve onu üretimde kaldırmak için endişelenmenize gerek yoktur. github.com/visionmedia/debug
wgp

1
Bir hata benim NodeJS app oluşursa i am ... alamadım değil Morgan kullanarak bir kayıt dosyasına bu hatayı kaydetmek için? veya Winston, veya Bunyan? değilse o zaman bunun için ne kullanırdım?
Randy L

2
OP, Morgan'ı verileri incelemek ve geliştirmedeki uygulamasının hatalarını ayıklamak için kullanmak istediğini ima etti ki bu gerçekten Debug modülü gibi bir şeyle yapılmalıdır. Üretimdeki bir dosyaya mutlaka hatalar kaydetmelisiniz. Uygulamanızı yukarıdaki cevabımda önerdiğim gibi kurarsanız, hatalar üretimdeki bir dosyaya ve geliştirme aşamasındaki konsola kaydedilir. Bu işleri açıklığa kavuşturuyor mu?
wgp

17

Aynı sorunla daha önce karşılaştım ve onun yerine Winston kullandım. Yukarıda arkadaşlar dediği gibi, morgan istek / yanıtın otomatik olarak günlüğe kaydedilmesi içindir. Winston, log4Net / log4J ile hemen hemen aynı şekilde yapılandırılabilir, önem seviyeleri, günlük yapabileceğiniz farklı akışlar vb.

Örneğin:

npm install winston

Ardından, aşağıdaki kodu uygulama başlatmanızda bir yerde çağırırsanız:

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

not: yukarıdaki kodu çağırmadan önce winston.loggers boştur, yani henüz yapılandırılmış herhangi bir kaydediciniz yok. Log4Net / J XmlConfigure yöntemlerine çok benzer - günlüğe kaydetmeyi başlatmak için önce onları çağırmanız gerekir.

Daha sonra, uygulama sunucusu tarafı kodunuzun neresinde olursanız olun şunları yapabilirsiniz:

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

Umarım yardımcı olur.

daha fazla belge referansı için: https://www.npmjs.com/package/winston


Java türü dillerden MEAN yığınına geçiş yapan geliştiriciler için bu durumun onları rahat ve tanıdık hale getireceğini söylemeliyim. Teşekkürler
Jayesh

Uygulamam dağıtıldığında bu günlük dosyasına nasıl erişebileceğimi söyleyebilir misiniz, aslında günlük dosyasını bulut depolama alanına kaydetmek istiyorum, ancak uygun bir yol bulamıyorum
Abhay Sehgal

9

Morgan: - Morgan, uygulamamıza erişen müşterileri belirlememize yardımcı olacak bir ara yazılımdır. Temelde bir kaydedici.

Morgan'ı Kullanmak için aşağıdaki adımları izlememiz gerekiyor: -

  1. Morgan'ı aşağıdaki komutu kullanarak kurun:

npm install --save morgan

Bu, json.package dosyasına morgan ekleyecektir.

  1. Morganı projenize dahil edin

var morgan = require('morgan');

3> // bir yazma akışı oluştur (ekleme modunda)

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

Not: Körü körüne yukarı çıkmadığınızdan emin olun, ihtiyacınız olan her koşula sahip olduğunuzdan emin olun.

Yukarıdakiler, kullanıcı uygulamanıza eriştiğinde kökünüz için otomatik olarak bir access.log dosyası oluşturacaktır.


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

örnek nodejs + express + morgan


4

Benim durumumda:

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

DÜZELTME: Visual Studio kodunu kullanıyordum ve bunu Başlatma Yapılandırmama eklemem gerekiyordu

"outputCapture": "std"

Bir IDE'den çalıştırıyorsanız, IDE'nin soruna neden olmadığından emin olmak için doğrudan komut satırından çalıştırın.


Is not console.log()ayrıca standart çıktıya basar?
Old Geezer

0

Mongo-morgan-ext kullanmayı denemek isteyebilirsiniz

Kullanım şudur:

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

Beklenen çıktı

{
    "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'ı kullanmak oldukça basittir. Gibi belgeler anlaşılacağı, Morgan ile istenilen çıktıyı elde etmek için farklı yollar vardır. Önceden yapılandırılmış günlükleme yöntemleriyle birlikte gelir veya kendiniz bir tane tanımlayabilirsiniz. Örneğin.

const morgan = gerekli ('morgan')

app.use (morgan ('küçük')

Bu size minik adı verilen ön konfigürasyonu verecektir. Ne yaptığını terminalinizde fark edeceksiniz. Bundan memnun kalmazsanız ve daha derine inmek istiyorsanız, örneğin istek url'sini söyleyelim, o zaman tokenlerin geldiği yer burasıdır.

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

o zaman şu şekilde kullanın:

app.use (morgan (': url')

Belgeleri orada vurgulanmış olarak kontrol edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.