需求
将每次前端请求过来的api请求都保存为日志,并按日期储存为本地文件。
日志工具
simple-node-logger
(日志库,你换其他也可以)
实现步骤
- 引入日志库
在根目录下创建helpers
文件夹,并创建logger.js
文件
// helpers/logger.js
const simpleLogger = require('simple-node-logger');
const logger = simpleLogger.createRollingFileLogger({
logDirectory: 'logs/',
fileNamePattern: 'strapi_log_<DATE>.log',
dateFormat: 'YYYY.MM.DD',
});
module.exports = logger;
-
在根目录下创建
logs
文件夹,用来放日志文件 -
在根目录
config
文件夹下创建policies
文件夹,并创建log.js
文件
// config/policies/log.js
const logger = require('../../helpers/logger');
module.exports = async (ctx, next) => {
let message = ctx.request.url;
if (ctx.request.header.name) {
message += ' ';
// 前端 encodeURIComponent 参数;
message += decodeURIComponent(ctx.request.header.name)
}
logger.info(message);
return await next();
}
Policies 策略是能够在每个请求到达控制器的操作之前对其执行特定逻辑的函数。它们主要用于简单地保护业务逻辑。项目的每个路由都可以关联到一组策略。
参考文档
- 以我的一个集合
tip
为例,在api/tip/config/routes.json
下配置全局Policies 策略
- 保存,重启,完成
如果你已经实现功能,且不想了解其他方法,那么到此为止,就可以点右上角叉叉了。
其他方法
-
如果你不想使用全局,那就在每个集合下单独创建
policies
文件夹,如api/tip/config/policies
,然后创建log.js或者其他名字文件,在api/tip/config/routes.json
里配置的时候去掉global
相关字样就可以了 -
如果你不想写policies,你可以在
Controllers
层来添加日志逻辑。例如在api\tip\controllers\tip.js
文件中重写代码
// api/tips/controller/tip.js
const logger = require('../../../helpers/logger');
module.exports = {
async find(ctx){
logger.info('Log information to log files');
logger.error('Log error to log files');
return 'Hello World!';
}
}
机智的你似乎已经发现,你这样的操作已经重写了原有的find逻辑,因此现在所有
http://localhost:1337/tips
请求都将返回Hello World!
。有补救方法吗?当然有,看下面
// api/tips/controller/tip.js
const logger = require('../../../helpers/logger');
module.exports = {
async find(ctx){
logger.info('Log information to log files');
logger.error('Log error to log files');
// 获取数据
const entity = await strapi.services.tip.find();
return entity;
}
...
// 其他的方法,如post、put,如果需要都要写一遍
}
补救方法是在代码里加上获取数据逻辑,当然更好的建议是你根本就不要去overwrite这个文件!重写之前请想想自己的代码能力!
参考资料:https://cloud.tencent.com/developer/ask/sof/540967/answer/829537