如何使用摩根记录器?

Gre*_*een 97 logging node.js express

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

我想看看变量是什么.这是来自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);
};
Run Code Online (Sandbox Code Playgroud)

如何使用摩根?

Nik*_*pal 104

似乎你也和我一样困惑,我偶然发现了这个问题.我认为我们将日志与手动日志关联,就像我们在Java中用log4j(如果你知道java)那样我们实例化一个Logger并说log'this'.

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

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

console.log(..);
Run Code Online (Sandbox Code Playgroud)

或者,如果您想为对象创建漂亮的输出:

var util = require("util");
console.log(util.inspect(..));
Run Code Online (Sandbox Code Playgroud)


mfl*_*999 54

我想我有一种方法可能无法得到你想要的东西,但是你可以将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);
Run Code Online (Sandbox Code Playgroud)

现在你可以把你想要的任何东西写到AppLog上,Morgan会把它想要的东西写到同一个地方,使用相同的appenders等等.当然,你可以在流包装器而不是debug()中调用info()或任何你喜欢的东西. - 这只反映了您希望为Morgan的req/res日志记录提供的日志记录级别.


Bil*_*ill 32

摩根不应该习惯以你描述的方式登录.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'));
}
Run Code Online (Sandbox Code Playgroud)

请注意您看到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
Run Code Online (Sandbox Code Playgroud)

所以你的问题的答案就是你提出了错误的问题.但是,如果您仍然想使用Morgan来记录请求,那么就去吧.

  • OP 暗示他想使用 Morgan 检查数据并调试他的应用程序,这应该使用 Debug 模块之类的东西来完成。您绝对应该将错误记录到生产中的文件中。如果您按照我在上面的回答中的建议设置您的应用程序,那么错误将记录到生产中的文件和开发中的控制台中。这能解决问题吗? (2认同)

akr*_*smv 15

我之前遇到过同样的问题,而是使用了温斯顿.如上所述,摩根用于自动记录请求/响应.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,
    },
});
Run Code Online (Sandbox Code Playgroud)

注意:在调用上面的代码之前,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')
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

有关进一步的文档参考:https://www.npmjs.com/package/winston


小智 9

摩根: - 摩根是一个中间件,可以帮助我们识别访问我们应用程序的客户.基本上是记录器.

要使用摩根,我们需要遵循以下步骤: -

  1. 使用以下命令安装morgan:

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}));
Run Code Online (Sandbox Code Playgroud)

注意:确保您不要盲目地检查以上,确保您拥有所需的所有条件.

一旦用户访问您的应用,上面将自动创建一个access.log文件到您的root.


小智 7

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!')
});
Run Code Online (Sandbox Code Playgroud)

示例nodejs + express + morgan