How to use Morgan logger?
我无法登录Morgan。 它不会将信息记录到控制台。 该文档没有说明如何使用它。
我想看看什么是变量。 这是来自expressjs框架的
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')); } |
注意生产线,在该生产线中,您看到使用选项哈希
该对象的
如果您想即时检查事物,请使用内置的
1 2 | var util = require('util'); console.log(util.inspect(anyObject)); // Will give you more details than console.log |
因此,对您的问题的答案是您在问错问题。但是,如果您仍然想使用Morgan来记录请求,就可以了。
我之前也遇到过同样的问题,相反,我使用了winston。正如上面所说的,摩根用于请求/响应的自动记录。 Winston的配置方式几乎与log4Net / log4J相同,具有严重性级别,可登录的流不同等。
例如:
然后,如果您在应用程序初始化的某个位置调用以下代码:
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,我们需要执行以下步骤:-
这会将morgan添加到json.package文件中
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":"" } } |