Làm thế nào để sử dụng Morgan logger?


109

Tôi không thể đăng nhập với Morgan. Nó không ghi thông tin vào bảng điều khiển. Tài liệu không cho biết cách sử dụng nó.

Tôi muốn xem biến là gì. Đây là mã từ response.jstệp của khung 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);
};

Làm thế nào để sử dụng Morgan?

Câu trả lời:


111

Có vẻ như bạn cũng đang bối rối với điều tương tự như tôi, lý do tôi vấp phải câu hỏi này. Tôi nghĩ rằng chúng ta kết hợp việc ghi nhật ký với ghi nhật ký thủ công như chúng ta làm trong Java với log4j (nếu bạn biết java), nơi chúng ta khởi tạo một Người ghi nhật ký và nói nhật ký 'this'.

Sau đó, tôi đào mã morgan, hóa ra nó không phải là loại máy ghi nhật ký, nó là để ghi nhật ký tự động các yêu cầu, phản hồi và dữ liệu liên quan. Khi được thêm vào làm phần mềm trung gian cho ứng dụng express / connect, theo mặc định, nó sẽ ghi các câu lệnh vào stdout hiển thị chi tiết về: ip từ xa, phương thức yêu cầu, phiên bản http, trạng thái phản hồi, tác nhân người dùng, v.v. Nó cho phép bạn sửa đổi nhật ký bằng cách sử dụng mã thông báo hoặc thêm màu sắc cho chúng bằng cách xác định 'dev' hoặc thậm chí đăng xuất khỏi luồng đầu ra, chẳng hạn như tệp.

Đối với mục đích mà chúng tôi nghĩ rằng chúng tôi có thể sử dụng nó, như trong trường hợp này, chúng tôi vẫn phải sử dụng:

console.log(..);

Hoặc nếu bạn muốn làm cho đầu ra đẹp cho các đối tượng:

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

60

Tôi nghĩ rằng tôi có một cách mà bạn có thể không nhận được chính xác những gì bạn muốn, nhưng bạn có thể tích hợp ghi nhật ký của Morgan với log4js - nói cách khác, tất cả hoạt động ghi nhật ký của bạn có thể đến cùng một nơi. Tôi hy vọng thông báo này từ một máy chủ Express ít nhiều sẽ tự giải thích:

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

Giờ đây, bạn có thể viết bất cứ thứ gì bạn muốn vàoAppLog và Morgan sẽ viết những gì nó muốn vào cùng một nơi, sử dụng cùng một trình phụ trợ, v.v. Tất nhiên, bạn có thể gọi info () hoặc bất cứ thứ gì bạn thích trong trình bao bọc luồng thay vì gỡ lỗi () - điều đó chỉ phản ánh cấp độ ghi nhật ký bạn muốn cung cấp cho ghi nhật ký yêu cầu / res của Morgan.


38

Morgan không nên được sử dụng để đăng nhập theo cách bạn đang mô tả. Morgan được xây dựng để thực hiện việc ghi nhật ký theo cách mà các máy chủ như Apache và Nginx đăng nhập vào error_log hoặc access_log. Để tham khảo, đây là cách bạn sử dụng 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'));
}

Lưu ý dây chuyền sản xuất nơi bạn thấy morgan được gọi với hàm băm tùy chọn {skip: ..., stream: __dirname + '/../morgan.log'}

Các streamtài sản của đối tượng mà xác định nơi các đầu ra logger. Theo mặc định, đó là STDOUT (bảng điều khiển của bạn, giống như bạn muốn) nhưng nó sẽ chỉ ghi dữ liệu yêu cầu. Nó sẽ không làm những gì console.log()hiện.

Nếu bạn muốn kiểm tra mọi thứ một cách nhanh chóng, hãy sử dụng utilthư viện được tích hợp sẵn :

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

Vì vậy, câu trả lời cho câu hỏi của bạn là bạn đang đặt câu hỏi sai. Nhưng nếu bạn vẫn muốn sử dụng Morgan cho các yêu cầu ghi nhật ký, bạn cứ làm.


Bạn đề xuất gì cho kiểu ghi nhật ký đó?
Noah

Gói gỡ lỗi là những gì bạn có thể muốn. Ý tưởng cơ bản thực sự là thay vì sử dụng, console.log()bạn có thể sử dụng Gỡ lỗi lib ở bất kỳ đâu trong mã của mình và bạn không cần phải lo lắng về việc xóa nó trong quá trình sản xuất. github.com/visionmedia/debug
wgp

1
tôi không hiểu ... nếu lỗi xảy ra trong ứng dụng NodeJS của tôi, tôi có phải ghi lỗi đó trong logfile bằng morgan không? hoặc wonton, hoặc bunyan? nếu không thì tôi sẽ sử dụng cái gì?
Randy L

2
OP ngụ ý rằng anh ta muốn sử dụng Morgan để kiểm tra dữ liệu và gỡ lỗi ứng dụng của anh ta trong quá trình phát triển, điều này thực sự nên được thực hiện với một cái gì đó như mô-đun Gỡ lỗi. Bạn hoàn toàn nên ghi lỗi vào một tệp trong sản xuất. Nếu bạn thiết lập ứng dụng của mình như tôi đề xuất trong câu trả lời của tôi ở trên thì lỗi sẽ được ghi vào tệp đang sản xuất và bảng điều khiển đang phát triển. Điều đó có làm sáng tỏ mọi thứ không?
wgp

17

Tôi đã đối mặt với vấn đề tương tự trước đây và thay vào đó, tôi sử dụng Winton. Như các bạn ở trên đã nói, morgan dùng để ghi nhật ký tự động yêu cầu / phản hồi. Winston có thể được định cấu hình khá giống với log4Net / log4J, có các mức độ nghiêm trọng, các luồng khác nhau mà bạn có thể đăng nhập, v.v.

Ví dụ:

npm install winston

Sau đó, nếu bạn gọi mã dưới đây ở đâu đó khi khởi tạo ứng dụng của bạn:

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

lưu ý: trước khi gọi mã trên, wonton.loggers trống, tức là bạn chưa có bất kỳ trình ghi nhật ký nào được định cấu hình. Khá giống với các phương thức Log4Net / J XmlConfigure - trước tiên bạn cần gọi chúng để bắt đầu ghi nhật ký của mình.

Sau đó, bất cứ nơi nào trong bạn mã phía máy chủ ứng dụng, bạn có thể thực hiện:

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

Hy vọng rằng sẽ giúp.

để tham khảo thêm tài liệu: https://www.npmjs.com/package/winston


Tôi phải nói rằng, đối với các nhà phát triển chuyển từ ngôn ngữ kiểu Java sang ngăn xếp MEAN, điều này sẽ khiến họ thoải mái và quen thuộc. Cảm ơn
Jayesh

bạn có thể cho tôi biết làm thế nào tôi có thể truy cập tập tin đăng nhập này khi ứng dụng của tôi được triển khai, thực sự tôi muốn lưu file log trên lưu trữ đám mây, nhưng không thể tìm thấy một cách thích hợp
Abhay Sehgal

9

Morgan: - Morgan là một phần mềm trung gian sẽ giúp chúng tôi xác định những khách hàng đang truy cập vào ứng dụng của chúng tôi. Về cơ bản là một máy ghi nhật ký.

Để sử dụng Morgan, chúng ta cần làm theo các bước sau: -

  1. Cài đặt morgan bằng lệnh dưới đây:

npm install --save morgan

Điều này sẽ thêm morgan vào tệp json.package

  1. Bao gồm morgan trong dự án của bạn

var morgan = require('morgan');

3> // tạo luồng ghi (ở chế độ nối thêm)

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

Lưu ý: Hãy chắc chắn rằng bạn không cố gắng vượt qua một cách mù quáng để đảm bảo rằng bạn có mọi điều kiện cần thiết.

Bên trên sẽ tự động tạo tệp access.log tới thư mục gốc của bạn sau khi người dùng truy cập ứng dụng của bạn.


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

ví dụ nodejs + express + morgan


4

Trong trường hợp của tôi:

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

Khắc phục: Tôi đang sử dụng mã Visual Studio và tôi phải thêm mã này vào Cấu hình khởi chạy của mình

"outputCapture": "std"

Đề xuất, trong trường hợp bạn đang chạy từ IDE, hãy chạy trực tiếp từ dòng lệnh để đảm bảo IDE không gây ra sự cố.


Không phải cũng console.log()ghi vào đầu ra tiêu chuẩn?
Old Geezer

0

Bạn có thể muốn thử sử dụng mongo-morgan-ext

Cách sử dụng là:

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

Sản lượng dự kiến ​​là

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

Sử dụng morgan khá đơn giản. Như tài liệu gợi ý, có nhiều cách khác nhau để có được đầu ra mong muốn của bạn với morgan. Nó đi kèm với các phương pháp ghi nhật ký được định cấu hình sẵn hoặc bạn có thể tự mình xác định. Ví dụ.

const morgan = demand ('morgan')

app.use (morgan ('nhỏ')

Điều này sẽ cung cấp cho bạn cấu hình sẵn gọi là tiny. Bạn sẽ nhận thấy trong thiết bị đầu cuối của bạn những gì nó làm. Trong trường hợp bạn không hài lòng với điều này và bạn muốn sâu hơn, ví dụ: hãy nói url yêu cầu, thì đây là nơi mã thông báo xuất hiện.

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

sau đó sử dụng nó như vậy:

app.use (morgan (': url')

Kiểm tra tài liệu tất cả đều được đánh dấu ở đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.