Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用摩根记录器?_Node.js_Logging_Express - Fatal编程技术网

Node.js 如何使用摩根记录器?

Node.js 如何使用摩根记录器?,node.js,logging,express,Node.js,Logging,Express,我不能和摩根一起登录。它不会将信息记录到控制台。文档中没有说明如何使用它 我想看看变量是什么。这是expressjs框架的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; //

我不能和摩根一起登录。它不会将信息记录到控制台。文档中没有说明如何使用它

我想看看变量是什么。这是expressjs框架的
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);
};

如何使用摩根?

看来你也对我以前的想法感到困惑,这就是我偶然发现这个问题的原因。我认为我们将日志记录与手动日志记录联系起来,就像我们在Java中使用log4j(如果您知道Java)一样,在这里我们实例化了一个日志记录程序并说log'this'

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

出于我们认为可以使用它的目的,在本例中,我们仍然必须使用:

console.log(..);
或者,如果要使对象的输出美观:

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

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

现在,您可以在应用程序日志中写入任何您想要的内容,Morgan将使用相同的appender等将其写入相同的位置。当然,您可以在流包装器中调用info()或您喜欢的任何内容,而不是debug()--这只反映了您希望为Morgan的req/res日志记录提供的日志记录级别。

不应使用Morgan以您描述的方式进行日志记录。Morgan以Apache和Nginx等服务器记录错误日志或访问日志的方式进行日志记录。作为参考,以下是您使用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记录请求,那就这样吧

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

我以前也遇到过同样的问题,取而代之的是我使用了温斯顿。正如上面提到的,morgan用于自动记录请求/响应。Winston的配置方式与log4Net/log4J几乎相同,它具有严重性级别,可以记录不同的流等

例如:

npm安装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/jxmlconfigure方法非常相似——您需要首先调用它们,以初始化日志记录

然后,稍后在应用程序服务器端代码中,您可以执行以下操作:

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')
希望有帮助


有关更多文档参考:

您可能希望尝试使用

用法是:

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

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

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

  • 使用以下命令安装morgan:
  • npm安装--保存morgan

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

  • 在你的项目中包括摩根
  • var morgan=require('morgan')

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

    注: 确保你不要盲目地垂直于上面确保你有每一个 你需要的条件

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

    在我的情况下:

    -console.log()  // works
    -console.error() // works
    -app.use(logger('dev')) // Morgan is NOT logging requests that look like "GET /myURL 304 9.072 ms - -"
    
    修复:我使用的是VisualStudio代码,我必须将其添加到我的启动配置中

    "outputCapture": "std"
    

    建议,如果您是从IDE运行,请直接从命令行运行,以确保IDE不会导致问题。

    使用morgan非常简单。正如他们所建议的,摩根有不同的方法来获得你想要的产出。它附带预配置的日志记录方法,或者您可以自己定义一种。例如

    const morgan=require('morgan')

    应用程序使用(morgan('tiny'))

    这会给你一个叫做tiny的预配置,你会在终端上注意到它的作用。 如果您对此不满意,并且希望更深入,比如说请求url,那么这就是令牌的作用

    morgan.token('url',函数(请求,资源){ 返回“/api/myendpoint” })

    然后像这样使用它:

    app.use(morgan(“:url”)

    检查文档,并将其全部突出显示。

    只需执行以下操作:

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

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

    app.use(morgan('tiny'));
    
    假设您想记录一个post请求数据,您可以创建一个

    morgan.token('postData',(请求)=>{
    if(request.method==“POST”)返回“”+JSON.stringify(request.body);
    否则返回“”;
    });
    应用程序使用(
    摩根(
    “:方法:url:status:res[content length]:响应时间ms:postData”
    )
    );
    
    这将在控制台中将POST请求记录为

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

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

    您建议使用哪种日志记录?调试包是您可能需要的。真正的基本思想是,不要使用
    console.log()
    您可以在代码中的任何地方使用调试库,而无需担心在生产中删除它。我不明白……如果我的NodeJS应用程序中出现错误,我是否可以使用morgan?或winston或bunyan将该错误记录在日志文件中?如果不是,我将使用什么?OP暗示他想使用morgan检查数据在开发中调试他的应用程序
    "outputCapture": "std"
    
    app.use(morgan('tiny'));