1. 准备
- 需要先配置开发和线上环境,参考链接https://blog.csdn.net/qq_40881695/article/details/120862118
- 根目录下创建 logs 文件夹,在 logs 文件夹下创建 access.log 文件
2. 实现
-
日志存储到数据库
// controller/logs.js const add = async (referer, agent, platform, status, logintime) => { const sql = `insert into logs (referer, agent, platform, status, logintime) values ('${referer}', '${agent}', '${platform}', '${status}', '${logintime}')`; const result = exec(sql); // exec 是执行 sql 语句的函数 return result; };
-
时间格式化函数
// utils/dateFormat.js // 时间戳格式化 function dateFormat(time) { const dt = new Date(time); const year = dt.getFullYear(); let month = dt.getMonth() + 1; let day = dt.getDate(); let hours = dt.getHours(); let minutes = dt.getMinutes(); let seconds = dt.getSeconds(); month = month < 10 ? "0" + month : month; day = day < 10 ? "0" + day : day; hours = hours < 10 ? "0" + hours : hours; minutes = minutes < 10 ? "0" + minutes : minutes; seconds = seconds < 10 ? "0" + seconds : seconds; const result = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; return result; } module.exports = dateFormat;
-
处理日志
// app.js const path = require("path"); const fs = require("fs"); // logger; const ENV = process.env.NODE_ENV; // 配置开发模式 const logFileName = path.join(__dirname, "logs", "access.log"); const writeStream = fs.createWriteStream(logFileName, { flags: "a", }); app.use(async (ctx, next) => { await next(); if (ENV === "dev") { const time = dateFormat(Date.now()); writeStream.write( `${time} ${ctx.method} -${ctx.url} -${ctx.response.status}\n` ); console.log(`${time} ${ctx.method} -${ctx.url} -${ctx.response.status}`); } let agent = ctx.header["user-agent"].indexOf("Chrome"); let platform = ctx.header["user-agent"].indexOf("Windows"); agent != -1 ? (agent = "Chrome") : (agent = "Firefox"); platform != -1 ? (platform = "Windows") : (platform = "Mac OS"); if (ctx.url === "/api/users/login") { await add( ctx.header.referer, agent, platform, ctx.response.body.code, dateFormat(Date.now()) ); } });