Node.js 如何使用摩根记录器?
我不能和摩根一起登录。它不会将信息记录到控制台。文档中没有说明如何使用它 我想看看变量是什么。这是expressjs框架的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; //
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,我们需要遵循以下步骤:-
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'));