关于node.js:如何使用Morgan logger?

How to use Morgan logger?

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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?


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

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

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

1
console.log(..);

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

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

我认为我有一种方法可能无法完全获得所需的结果,但是您可以将Morgan的日志记录与log4js集成在一起-换句话说,所有日志记录活动都可以在同一地方进行。我希望从Express服务器获得的摘要或多或少是不言自明的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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记录的记录级别。


Morgan不应被用来登录您所描述的方式。 Morgan被构建为以Apache和Nginx之类的服务器记录到error_log或access_log的方式进行日志记录。供参考,这是使用morgan的方式:

1
2
3
4
5
6
7
8
9
10
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'}调用的morgan

该对象的stream属性确定记录器输出的位置。默认情况下,它是STDOUT(您的控制台,就像您想要的一样),但它仅记录请求数据。它不会执行console.log()的操作。

如果您想即时检查事物,请使用内置的util库:

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

因此,对您的问题的答案是您在问错问题。但是,如果您仍然想使用Morgan来记录请求,就可以了。


我之前也遇到过同样的问题,相反,我使用了winston。正如上面所说的,摩根用于请求/响应的自动记录。 Winston的配置方式几乎与log4Net / log4J相同,具有严重性级别,可登录的流不同等。

例如:

npm install winston

然后,如果您在应用程序初始化的某个位置调用以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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方法非常相似-您需要先调用它们,以启动日志记录。

然后,以后无论在应用程序服务器端代码中的何处,您都可以执行以下操作:

1
2
3
4
5
6
7
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


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

要使用Morgan,我们需要执行以下步骤:-

  • 使用以下命令安装摩根:
  • npm install --save morgan

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

  • 在项目中包含摩根
  • var morgan = require('morgan');

    3> //创建写入流(以追加模式)

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

    注意:
    确保您不会盲目地探查上方,确保您拥有
    您需要的条件。

    用户将访问您的应用后,以上将自动为您的根创建一个access.log文件。


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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


    就我而言:

    1
    2
    3
    -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代码,并且我必须将此添加到我的启动配置

    1
    "outputCapture":"std"

    如果您是从IDE运行的,建议您直接从命令行运行,以确保IDE不会引起问题。


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

    const morgan = require('morgan')

    app.use(morgan('tiny')

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

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

    然后像这样使用它:

    app.use(morgan(' :url ')

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


    您可能想尝试使用mongo-morgan-ext

    用法是:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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

    预期的输出是

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    {
       "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":""
        }

    }