Bagaimana cara menggunakan Morgan logger?

109

Saya tidak bisa login dengan Morgan. Itu tidak mencatat info ke konsol. Dokumentasi tidak menjelaskan cara menggunakannya.

Saya ingin melihat apa itu variabel. Ini adalah kode dari response.jsfile framework 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);
};

Bagaimana cara menggunakan Morgan?

hijau
sumber

Jawaban:

112

Sepertinya Anda juga bingung dengan hal yang sama seperti saya, alasan saya tersandung pada pertanyaan ini. Saya pikir kita mengasosiasikan logging dengan logging manual seperti yang akan kita lakukan di Java dengan log4j (jika Anda tahu java) di mana kita membuat Logger dan mengatakan log 'ini'.

Kemudian saya menggali kode morgan, ternyata bukan jenis logger, itu untuk pencatatan otomatis permintaan, tanggapan dan data terkait. Ketika ditambahkan sebagai middleware ke aplikasi express / connect, secara default harus mencatat pernyataan ke stdout yang menampilkan detail: ip jarak jauh, metode permintaan, versi http, status respons, agen pengguna, dll. Hal ini memungkinkan Anda untuk memodifikasi log menggunakan token atau menambahkan warna pada mereka dengan mendefinisikan 'dev' atau bahkan keluar ke aliran keluaran, seperti sebuah file.

Untuk tujuan kami pikir kami dapat menggunakannya, karena dalam kasus ini, kami masih harus menggunakan:

console.log(..);

Atau jika Anda ingin membuat keluaran cantik untuk objek:

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

Saya rasa saya punya cara di mana Anda mungkin tidak mendapatkan apa yang Anda inginkan, tetapi Anda bisa mengintegrasikan logging Morgan dengan log4js - dengan kata lain, semua aktivitas logging Anda bisa pergi ke tempat yang sama. Saya harap intisari dari server Express ini kurang lebih cukup jelas:

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

Sekarang Anda dapat menulis apa pun yang Anda inginkan ke AppLog dan Morgan akan menulis apa yang diinginkannya ke tempat yang sama, menggunakan appenders yang sama, dll. Tentu saja, Anda dapat memanggil info () atau apa pun yang Anda suka di stream wrapper daripada debug () - yang hanya mencerminkan tingkat logging yang ingin Anda berikan ke logging req / res Morgan.

mflo999.dll
sumber
38

Morgan tidak boleh digunakan untuk login seperti yang Anda gambarkan. Morgan dibangun untuk melakukan logging dengan cara server seperti Apache dan Nginx masuk ke error_log atau access_log. Sebagai referensi, berikut cara Anda menggunakan 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'));
}

Perhatikan jalur produksi di mana Anda melihat morgan dipanggil dengan hash opsi {skip: ..., stream: __dirname + '/../morgan.log'}

The streamproperti dari objek yang menentukan di mana output logger. Secara default itu STDOUT (konsol Anda, seperti yang Anda inginkan) tetapi itu hanya akan mencatat data permintaan. Itu tidak akan melakukan apa yang console.log()dilakukannya.

Jika Anda ingin memeriksa sesuatu dengan cepat, gunakan utilperpustakaan bawaan:

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

Jadi jawaban atas pertanyaan Anda adalah Anda mengajukan pertanyaan yang salah. Tetapi jika Anda masih ingin menggunakan Morgan untuk permintaan logging, itu dia.

wgp
sumber
Apa yang Anda rekomendasikan untuk penebangan semacam itu?
Noah
Paket Debug adalah yang Anda inginkan. Ide dasar sebenarnya adalah daripada menggunakan console.log()Anda dapat menggunakan lib Debug di mana saja dalam kode Anda dan Anda tidak perlu khawatir tentang menghapusnya dalam produksi. github.com/visionmedia/debug
wgp
1
saya tidak mengerti ... jika terjadi kesalahan di aplikasi NodeJS saya, apakah saya tidak mencatat kesalahan itu di logfile menggunakan morgan? atau winston, atau bunyan? jika tidak lalu apa yang akan saya gunakan untuk itu?
Randy L
2
OP menyiratkan bahwa dia ingin menggunakan Morgan untuk memeriksa data dan men-debug aplikasinya dalam pengembangan yang seharusnya dilakukan dengan sesuatu seperti modul Debug. Anda benar-benar harus mencatat kesalahan ke file dalam produksi. Jika Anda mengatur aplikasi Anda seperti yang saya sarankan dalam jawaban saya di atas, maka kesalahan masuk ke file dalam produksi dan ke konsol dalam pengembangan. Apakah itu menjelaskan semuanya?
wgp
17

Saya menghadapi masalah yang sama lalu, saya menggunakan winston. Seperti yang dikatakan rekan-rekan di atas, morgan adalah untuk pencatatan permintaan / tanggapan otomatis. Winston dapat dikonfigurasi dengan cara yang hampir sama seperti log4Net / log4J, memiliki tingkat keparahan, aliran berbeda yang dapat Anda catat, dll.

Sebagai contoh:

npm install winston

Kemudian, jika Anda memanggil kode di bawah ini di suatu tempat pada inisialisasi aplikasi Anda:

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

catatan: sebelum memanggil kode di atas, winston.loggers kosong, yaitu Anda belum memiliki logger yang dikonfigurasi. Mirip dengan metode Log4Net / J XmlConfigure - Anda harus memanggilnya terlebih dahulu, untuk memasukkan logging Anda.

Kemudian, nanti di mana pun di kode sisi server aplikasi Anda, Anda dapat melakukan:

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

Semoga membantu.

untuk referensi dokumentasi lebih lanjut: https://www.npmjs.com/package/winston

akrsmv
sumber
Saya harus mengatakan, untuk pengembang yang beralih dari bahasa tipe Java ke tumpukan MEAN, ini akan membuat mereka nyaman dan akrab. Terima kasih
Jayesh
dapatkah Anda memberi tahu saya bagaimana saya dapat mengakses file log ini ketika aplikasi saya diterapkan, sebenarnya saya ingin menyimpan file log di penyimpanan cloud tetapi tidak dapat menemukan cara yang tepat
Abhay Sehgal
9

Morgan: - Morgan adalah middleware yang akan membantu kita mengidentifikasi klien yang mengakses aplikasi kita. Pada dasarnya logger.

Untuk Menggunakan Morgan, Kita perlu mengikuti langkah-langkah di bawah ini: -

  1. Instal morgan menggunakan perintah di bawah ini:

npm install --save morgan

Ini akan menambahkan morgan ke file json.package

  1. Sertakan morgan dalam proyek Anda

var morgan = require('morgan');

3> // buat aliran tulis (dalam mode tambahkan)

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

Catatan: Pastikan Anda tidak tersandung di atas secara membabi buta pastikan Anda memiliki setiap kondisi yang Anda butuhkan.

Di atas akan secara otomatis membuat file access.log ke root Anda setelah pengguna mengakses aplikasi Anda.

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

contoh nodejs + express + morgan

Carlos Ariza
sumber
4

Dalam kasus saya:

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

MEMPERBAIKI: Saya menggunakan kode Visual Studio, dan saya harus menambahkan ini ke Launch Config saya

"outputCapture": "std"

Saran, jika Anda menjalankan dari IDE, jalankan langsung dari baris perintah untuk memastikan IDE tidak menyebabkan masalah.

Sagan
sumber
Bukankah console.log()menulis ke keluaran standar juga?
Old Geezer
0

Anda mungkin ingin mencoba menggunakan mongo-morgan-ext

Penggunaannya adalah:

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

Output yang diharapkan adalah

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

}
Gautam Anand
sumber
0

Menggunakan morgan cukup mudah. Seperti yang disarankan oleh dokumentasinya , ada berbagai cara untuk mendapatkan hasil yang Anda inginkan dengan morgan. Itu datang dengan metode logging yang telah dikonfigurasi sebelumnya atau Anda dapat menentukannya sendiri. Misalnya.

const morgan = membutuhkan ('morgan')

app.use (morgan ('tiny')

Ini akan memberi Anda prakonfigurasi yang disebut tiny. Anda akan melihat di terminal Anda apa yang dilakukannya. Jika Anda tidak puas dengan ini dan Anda ingin lebih dalam misalnya katakanlah permintaan url, maka di sinilah token masuk.

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

lalu gunakan seperti ini:

app.use (morgan (': url')

Periksa dokumentasi yang semuanya disorot di sana.

Moe
sumber