2.5 自己动手写一个日志中间件
优质
小牛编辑
138浏览
2023-12-01
当我们的网站运行在线上的时候,我们可能希望记录一下访问者的 IP 地址,以及一些其他操作,比如说敏感操作。这一小节,我们就来完成它,不过我这里完全是抛砖引玉,这里存储日志的地方是本地的文件夹,你大可以存放到数据库中,或者其他服务器提供商存储空间里面,比如 LeanCloud、FireBase 等等。
2.5.1 初始化项目
mkdir ep && cd ep
npm init -y
npm i -S express
2.5.2 新建 app.js
vim app.js
const express = require('express');
const app = express();
app.get('/', function (req, res, next) {
res.send("Hello World")
});
app.listen(3000);
:wq
进行保存。
2.5.3 运行
node app.js
打开 localhost:3000,此刻我们的 helloworld 已经成功的运行了。
2.5.4 新建 log.js
一共30几行代码,这个中间件非常的简单。
const fs = require('fs');
const path = require('path');
const createFolderIfNotExists = (dir) => {
try{
fs.statSync(dir);
}catch(e){
fs.mkdirSync(dir);
console.log("日志文件夹创建成功");
}
}
module.exports = function(opts = {}){
return (req, res, next) => {
const outPutDir = opts.output || path.resolve(__dirname, 'logs');
const nowDate = new Date();
if (opts.close) {
return next();
}
const logMsg = `${nowDate.toLocaleDateString()} ${nowDate.toLocaleTimeString()} => ${req.ip} \n`;
createFolderIfNotExists(outPutDir)
fs.createWriteStream(outPutDir + '/' + nowDate.toLocaleDateString() + '.log', {
flags: 'a+'
}).write(logMsg);
return next();
}
}
createFolderIfNotExists 是当不存在目录的时候进行创建,并且可以通过 opts.close 可以关闭该中间件。fs.createWriteStream 创建一个可写流,第一个参数是路径,第二个参数是配置项,之后给流 write 写入数据即可。这都是使用了 node.js 的一些 简单的 api。
2.5.5 在 app.js 使用 log 中间件
const express = require('express');
const app = express();
const log = require('./log');
app.use(log());
app.get('/', function (req, res, next) {
res.send("Hello World")
});
app.listen(3000);
运行之后,访问网站,之后看看有没有 logs 文件夹,里面有没有数据。