如何使用摩根记录器?

时间:2014-05-06 12:37:10

标签: node.js logging express

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

我想知道变量是什么。这是来自expressjs framework的response.js文件的代码:

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

如何使用摩根?

11 个答案:

答案 0 :(得分:97)

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

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

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

console.log(..);

或者如果你想让对象的输出漂亮:

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

答案 1 :(得分:51)

我认为我有一种方法可能无法得到你想要的东西,但你可以将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会把它想要的东西写到同一个地方,使用相同的appenders等等。当然,你可以在流包装器中调用info()或任何你喜欢的东西而不是debug() - 它只反映了您想要给Morgan的req / res日志记录的日志记录级别。

答案 2 :(得分:26)

不应该使用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来记录请求,那么就去吧。

答案 3 :(得分:13)

我之前遇到过同样的问题而是使用了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

答案 4 :(得分:9)

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

example nodejs + express + morgan

答案 5 :(得分:8)

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

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

  1. 使用以下命令安装morgan:
  2. npm install --save morgan

    这会将morgan添加到json.package文件

    1. 将morgan包含在您的项目中
    2. var morgan = require('morgan');

      3&GT; //创建一个写入流(在追加模式下)

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

      注意: 确保你不要盲目地检查,确保你拥有每一个 你需要的条件。

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

答案 6 :(得分:2)

就我而言:

-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不会引起问题。

答案 7 :(得分:1)

只需执行以下操作:

app.use(morgan('tiny'));

它将起作用。

答案 8 :(得分: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": ""
    }

}

答案 9 :(得分:0)

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

const morgan = require('morgan')

app.use(摩根('tiny')

这将为您提供称为tiny的预配置。您会在终端中注意到它的作用。 如果您对此不满意并且想要更深入的了解假设说请求网址,那么这就是令牌进入的地方。

morgan.token('url',函数(req,res){ 返回'/ api / myendpoint' })

然后像这样使用它:

app.use(morgan(':url')

检查文档,所有文档在那里高亮显示。

答案 10 :(得分:0)

根据文档,您可以使用 predefined 方法记录请求数据

app.use(morgan('tiny'));

假设你想记录一个 post 请求数据,你可以创建一个 custom token 并像这样使用它

morgan.token('postData', (request) => {
  if (request.method == 'POST') return ' ' + JSON.stringify(request.body);
  else return ' ';
});

app.use(
  morgan(
    ':method :url :status :res[content-length] - :response-time ms :postData'
  )
);

这将在控制台中记录一个 POST 请求

POST /api/test2 409 33 - 0.253 ms  {"name":"Test name","number":"323-322-55"}

注意 - 您不应记录请求数据,因为它可能违反当地隐私法(例如欧盟的 GDPR)或业务标准。这只是一个例子