我无法登录摩根。它没有将信息记录到控制台。文档没有说明如何使用它。
我想知道变量是什么。这是来自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);
};
如何使用摩根?
答案 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!')
});
答案 5 :(得分:8)
摩根: - Morgan是一个中间件,可以帮助我们识别访问我们应用程序的客户。基本上是记录器。
要使用摩根,我们需要遵循以下步骤: -
npm install --save morgan
这会将morgan添加到json.package文件
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)或业务标准。这只是一个例子