วิธีใช้ Morgan Logger?


109

ฉันไม่สามารถเข้าสู่ระบบกับมอร์แกนได้ ไม่บันทึกข้อมูลลงในคอนโซล เอกสารไม่ได้บอกวิธีการใช้งาน

ฉันต้องการดูว่าตัวแปรคืออะไร นี่คือรหัสจาก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?

คำตอบ:


112

ดูเหมือนว่าคุณจะสับสนกับสิ่งเดียวกับฉันเหมือนกันเหตุผลที่ฉันสะดุดกับคำถามนี้ ฉันคิดว่าเราเชื่อมโยงการบันทึกเข้ากับการบันทึกด้วยตนเองเหมือนกับที่เราทำใน Java กับ log4j (ถ้าคุณรู้จัก java) โดยที่เราสร้างอินสแตนซ์ Logger และพูดว่า log 'this'

จากนั้นฉันขุดรหัสมอร์แกนปรากฎว่ามันไม่ใช่คนตัดไม้ประเภทนั้นมันมีไว้สำหรับการบันทึกคำขอการตอบกลับและข้อมูลที่เกี่ยวข้องโดยอัตโนมัติ เมื่อเพิ่มเป็นมิดเดิลแวร์ไปยังแอปด่วน / เชื่อมต่อโดยค่าเริ่มต้นควรบันทึกคำสั่งเป็น 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);

ตอนนี้คุณสามารถเขียนสิ่งที่คุณต้องการลงใน AppLog และ Morgan จะเขียนสิ่งที่ต้องการลงในที่เดียวกันโดยใช้ตัวต่อเดียวกันเป็นต้นและแน่นอนคุณสามารถโทรหา info () หรืออะไรก็ได้ที่คุณต้องการใน stream wrapper แทน debug () - นั่นแสดงถึงระดับการบันทึกที่คุณต้องการให้กับการบันทึก req / res ของ Morgan


38

ไม่ควรใช้ Morgan เพื่อเข้าสู่ระบบในแบบที่คุณกำลังอธิบาย Morgan ถูกสร้างขึ้นเพื่อทำการบันทึกในลักษณะที่เซิร์ฟเวอร์เช่น 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 สำหรับคำขอบันทึกก็ไปได้เลย


คุณแนะนำอะไรสำหรับการบันทึกแบบนั้น?
Noah

แพคเกจดีบักคือสิ่งที่คุณอาจต้องการ แนวคิดพื้นฐานที่แท้จริงคือแทนที่จะใช้console.log()คุณสามารถใช้ Debug lib ที่ใดก็ได้ในโค้ดของคุณและคุณไม่จำเป็นต้องกังวลเกี่ยวกับการลบออกในการผลิต github.com/visionmedia/debug
wgp

1
ฉันไม่เข้าใจ ... หากเกิดข้อผิดพลาดในแอป NodeJS ของฉันฉันจะไม่บันทึกข้อผิดพลาดนั้นในไฟล์บันทึกโดยใช้มอร์แกนหรือไม่ หรือวินสตันหรือบันยัน? ถ้าไม่เช่นนั้นฉันจะใช้อะไร?
Randy L

2
OP บอกเป็นนัยว่าเขาต้องการใช้ Morgan ในการตรวจสอบข้อมูลและดีบักแอพของเขาในการพัฒนาซึ่งควรจะทำกับโมดูล Debug คุณควรบันทึกข้อผิดพลาดไปยังไฟล์ในการใช้งานจริง หากคุณตั้งค่าแอปของคุณตามที่ฉันแนะนำในคำตอบของฉันด้านบนข้อผิดพลาดจะถูกบันทึกไปยังไฟล์ในการใช้งานจริงและไปยังคอนโซลที่กำลังพัฒนา สิ่งนั้นชัดเจนขึ้นหรือไม่?
wgp

17

ฉันประสบปัญหาเดียวกันที่ผ่านมาและฉันใช้วินสตันแทน ดังที่กล่าวไว้ข้างต้น 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 stack สิ่งนี้จะทำให้พวกเขาสะดวกสบายและคุ้นเคย ขอบคุณ
Jayesh

คุณช่วยบอกฉันได้ไหมว่าฉันจะเข้าถึงไฟล์บันทึกนี้ได้อย่างไรเมื่อแอปของฉันถูกทำให้ใช้งานได้ฉันต้องการบันทึกไฟล์บันทึกบนที่เก็บข้อมูลบนคลาวด์ แต่ไม่สามารถหาวิธีที่เหมาะสมได้
Abhay Sehgal

9

มอร์แกน: - มอร์แกนเป็นตัวกลางที่จะช่วยให้เราระบุลูกค้าที่กำลังเข้าถึงแอปพลิเคชันของเรา โดยพื้นฐานแล้วคนตัดไม้

ในการใช้ 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 และฉันต้องเพิ่มสิ่งนี้ใน Launch Config ของฉัน

"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

การใช้มอร์แกนค่อนข้างตรงไปตรงมา ตามเอกสารแนะนำมีหลายวิธีในการรับผลลัพธ์ที่คุณต้องการด้วยมอร์แกน มาพร้อมกับวิธีการบันทึกที่กำหนดค่าไว้ล่วงหน้าหรือคุณสามารถกำหนดวิธีการบันทึกด้วยตัวเอง เช่น.

const มอร์แกน = ต้องการ ('มอร์แกน')

app.use (มอร์แกน ('เล็ก ๆ ')

สิ่งนี้จะให้การกำหนดค่าล่วงหน้าที่เรียกว่าจิ๋ว คุณจะสังเกตเห็นในเทอร์มินัลของคุณว่ามันทำอะไร ในกรณีที่คุณไม่พอใจกับสิ่งนี้และคุณต้องการลึกกว่านั้นเช่นให้พูด url คำขอแล้วนี่คือที่มาของโทเค็น

morgan.token ('url', ฟังก์ชัน (req, res) {return '/ api / myendpoint'})

จากนั้นใช้มันดังนี้:

app.use (มอร์แกน (': url')

ตรวจสอบเอกสารที่ไฮไลต์ทั้งหมดที่นั่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.