如何使用Morgan logger?


109

我无法登录Morgan。它不会将信息记录到控制台。该文档没有说明如何使用它。

我想看看什么是变量。这是来自response.jsexpressjs框架文件的代码:

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?

Answers:


111

似乎您也对与我以前的事情感到困惑,这是我偶然发现此问题的原因。我认为我们将日志记录与手动日志记录相关联,就像我们在Java中使用log4j(如果您知道Java)那样,在其中实例化Logger并说log'this'。

然后我挖掘了摩根代码,结果证明它不是那种记录器,它是用于自动记录请求,响应和相关数据的。当作为中间件添加到express / connect应用程序时,默认情况下,它应将记录到stdout的日志记录显示以下详细信息:远程ip,请求方法,http版本,响应状态,用户代理等。它允许您使用令牌或通过定义'dev'甚至向输出流(例如文件)添加颜色。

出于我们认为可以使用它的目的,在这种情况下,我们仍然必须使用:

console.log(..);

或者,如果您想使对象的输出漂亮:

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

60

我认为我有一种方法可能无法完全获得所需的结果,但是您可以将Morgan的日志记录与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()或任何您喜欢的内容,而不是debug() -仅反映您要提供给Morgan的re / res记录的记录级别。


38

Morgan不应被用来登录您所描述的方式。Morgan的构建方式是使日志记录的方式类似于Apache和Nginx之类的服务器记录到error_log或access_log的方式。供参考,这是使用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'));
}

注意生产线,在该生产线中,您看到的morgan带有选项哈希 {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 2015年

1
我不明白...如果我的NodeJS应用程序发生错误,我是否使用morgan在日志文件中记录该错误?还是温斯顿,还是布尼扬?如果没有,那我该怎么用?
兰迪·L

2
OP暗示他想使用Morgan来检查数据并调试其开发中的应用程序,这实际上应该通过Debug模块来完成。您绝对应该将错误记录到生产中的文件中。如果按照我在上面的答案中建议的方式设置应用,则错误会记录到生产环境中的文件和开发中的控制台中。这样清除了吗?
wgp 2015年

17

我之前也遇到过同样的问题,相反,我使用了winston。正如上面所说的,摩根是用于请求/响应的自动日志记录。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堆栈的开发人员,这将使他们感到舒适和熟悉。谢谢
Jayesh

您能告诉我在部署应用程序后如何访问此日志文件吗,实际上我想将日志文件保存在云存储中,但找不到正确的方法
Abhay Sehgal

9

Morgan:-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 - -"

FIX:我正在使用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

使用摩根非常简单。正如文档所建议的那样,有多种方法可以通过morgan获得所需的输出。它带有预配置的日志记录方法,或者您可以自己定义。例如。

const morgan = require('morgan')

app.use(摩根('tiny')

这将为您提供称为tiny的预配置。您会在终端中注意到它的作用。如果您对此不满意,并且想更深入一点,例如说请求URL,那么这就是令牌的来源。

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

然后像这样使用它:

app.use(morgan(':url')

检查文档,所有文档均突出显示。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.