express实现morgan倒写日志

痛点:

    morgan打印的日志默认是最新的放在最后,在查看的时候需要一直向下翻,所以要对morgan进行深度定制,实现倒写日志

思路:

复制覆盖再粘贴

  1. 对文件的操作思路很简单,也就是说每次触发打印日志的时候,使用fs.readFileSync保存当前日志文件的所有内容
  2. 然后通过fs.writeFile把本次要打印的日志覆盖到日志文件
  3. 最后把之前保存的日志文件的内容复制在下面,—完成
    但最主要的要怎么在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日历的功能网站,持续开发中…

参考资料

morgan源码.
Node 进阶:express 默认日志组件 morgan 从入门使用到源码剖析

你可能感兴趣的:(功能总结)