痛点:
morgan打印的日志默认是最新的放在最后,在查看的时候需要一直向下翻,所以要对morgan进行深度定制,实现倒写日志
思路:
复制覆盖再粘贴
- 对文件的操作思路很简单,也就是说每次触发打印日志的时候,使用
fs.readFileSync保存当前日志文件的所有内容 - 然后通过
fs.writeFile把本次要打印的日志覆盖到日志文件 - 最后把之前保存的日志文件的内容复制在下面,---完成 但最主要的要怎么在morgan打印的时候执行上面的方法并且获取到本次morgan要打印的日志
利用morgan源码
morgan源码中,stream配置项大致实现是这样的(简化后)。
// opt为配置文件
var stream = opts.stream || process.stdout;
var logString = createLogString(); // 伪代码,根据format、token的定义,生成日志
stream.write(logString);
也就是说,morgan最后会调用一个write方法,并且把本次要打印的日志作为参数传进去 所以我们要做的就是,声明一个含有write方法的对象作为配置项,传入stream,而这个我们自己声明的write方法的逻辑就是上面第一步对文件的操作
// 覆盖morgan源代码中的write方法的对象
var dbStream = {
//会调用这个方法,并且传入本次的处理后的日志内容line
write: function(line) {
//保存当前日志文件的所有内容
var accessData = fs.readFileSync(path.join(__dirname, '../access.log')) //这个是绝对地址
//把本次的日志内容 覆盖 进日志文件
fs.writeFile('./access.log', line, function(err) { //相对地址,再执行的时候(app.js)的相对位置,所以是./而不是../
if (err) {
throw err;
}
//然后在把之前日志文件的内容加在后面
fs.writeFile('./access.log', accessData, {
'flag': 'a'
}, function(err) { // 传递了追加参数 { 'flag': 'a' },表示追加
if (err) {
throw err;
}
});
});
}
};
var logFunc = morgan('joke', {
//...
//...
//传入上面含有write的配置对象
stream: dbStream
})
module.exports = logFunc;
以上,如有错误,欢迎指出.
个人网站: lppwork.cn. 可以同步备忘录和添加task日历的功能网站,持续开发中...