Express 4.x中间件morgan(logger)的详细解析

来源:互联网 发布:秦时明月动漫知乎 编辑:程序博客网 时间:2024/06/10 17:51

开头先说写无关的话: 看了很多技术博客,最痛恨的就是那种拷贝粘贴党,要么就是那种原文翻译混乱党, 都是属于无脑型。
不仅如此,格式也是让人心生绝望。浪费了很多时间。
当然有些人写这些只是给自己记的笔记,自己也不能太过激。
好了,牢骚发过了,现在写正题。
express 4.x相比express 3.x有很大的改进。
特别是中间件方面,已经不再兼容,需要自己去下载。
所以只要碰到这种格式的 express.middleware, 在express 4.x都是用不了的。
以前的中间件logger模块,现在已经改名叫morgan了。
愚蠢的我也是踩了这些坑。

先安装模块

npm install morgan --save 

morgan的用途就是记录http通信时的操作日志。
先上点代码吧。
这是服务器端, app.js:

var express = require('express'); var morgan = require('morgan');var app = express();app.use(morgan('combined'));//运用中间件,‘combined’是日志显示的格式,后面会看到什么样app.get('/index2.html', function (req, res) {    res.sendFile(__dirname + '/index2.html');}); //将本地文件夹中的index2.html文件传到客户端app.post('/index2.html', function (req, res) {    req.on('data', function (data) {        console.log(data.toString());        res.end();    }); //响应index2.html的post请求 });app.listen(1338);//监听localhost:1338端口

这是客户端html2.html文件:
通过ajax来post表单的信息,我承认有点傻,其实直接表单提交就好了,但是就当是再学习下ajax吧。

<!DOCTYPE html><html><head>    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />    <script>        function submitData() {            var obj = {                firstname: document.getElementById('txtFirstName').value,                lastname: document.getElementById('txtLastName').value,            };            var xhr = new XMLHttpRequest();            xhr.open('POST', 'index2.html', true);            xhr.onload = function (e) {                if (this.status == 200) {                    document.getElementById('result').innerHTML = this.response;                }            };            xhr.send(JSON.stringify(obj));        }    </script></head><body>    <form id="form1">        firstname:        <input type="text" id="txtFirstName" name='firstname' value='ss' /></br>        lastname:        <input type="text" id="txtLastName" name="lastname" value="ll" /></br>        <input type="button" value="submit" onclick="submitData()" />    </form>    <output id="result"></output></body></html>

来,咱们运行起来

yourPath/node app.js

打开浏览器输入
http://localhost:1338/index2.html
看看你的node.js控制台吧:

可以看到如下界面:

先看看你的node.js的控制台吧:

::1 - - [23/Aug/2017:03:40:52 +0000] “GET /index2.html HTTP/1.1” 200
1095 “-” “Mozilla/5.0 (Wi ndows NT 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36 “

点击submit按钮后,再看看你的node.js控制台吧。

{“firstname”:”ss”,”lastname”:”ll”}
::1 - - [23/Aug/2017:03:42:27
+0000] “POST /index2.html HTTP/1.1” 200 - “http://localhost:1338 /index2.html” “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chro me/60.0.3112.101 Safari/537.36”

记录了一堆信息,但是格式那是相当的乱。

好了,现在问题来了,我怎样保存这些信息呢?
morgan提供了写入文件流来将这些信息保存在文件中:
我们改下服务端代码:

var express = require('express');var morgan = require('morgan');var fs = require('fs');//加了文件操作的模块var path = require('path');//加了解析路径的模块var app = express();var accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flag: 'a' });//创建一个写文件流,并且保存在当前文件夹的access.log文件中app.use(morgan('combined', { stream: accessLogStream }));//设置开启文件流,并且指明文件流的对象app.get('/index2.html', function (req, res) {    res.sendFile(__dirname + '/index2.html');});app.post('/index2.html', function (req, res) {    req.on('data', function (data) {        console.log(data.toString());        res.end();    });});app.listen(1338);

再次运行并且重复上面的操作,看看你的日志文件吧:
这里写图片描述

内容已经成功保存!

可是有人说这些太乱七八糟了,我其实只想保存少量信息,没问题!
你可以这样写:

app.use(morgan('tiny', { stream: accessLogStream }));

这样仅仅保存有限的信息
运行出来信息是这样的:

GET /index2.html 304 - - 6.205 ms

还有人比较有强迫症,说我只能接受某种格式,不想用正则再转换了!
这个。。。也行!
我们再次改下运用中间件的方法:

app.use(morgan(function (tokens, req, res) {    return [        tokens.method(req, res),        tokens.url(req, res),        tokens.status(req, res),        tokens.res(req, res, 'content-length'),        tokens['response-time'](req, res) + 'ms'    ].join('\r\n') }, { stream: accessLogStream }));//让每条自己设定的信息换行显示

那么你的文件出现是这样的:

GET /index2.html
304

7.853ms

这就是morgan中间件的大致用法。
详细用法还是看官方文档把。不过知道了这些,再来看官方文档就是so easy 了。

原创粉丝点击