虽然 console.log
很好用,但是生产环境需要保存日志的时候就比较蛋疼。暴力 fs.appendFile
会消耗大量的 file handler,因此用 writable stream 来复用 file handler 是更好的选择。
大概是个不能再简单的思路了。先创建一个写入流
1 2 3
| const fs = require('fs');
let logStream = fs.createWriteStream('./test.log');
|
这样便创建了一个文件写入口,需要时直接调用 logStream.write
即可写入数据。
接下来编写一个用于记录日志的函数替代 console.log
1 2 3
| function logger (message) { logStream.write(message); }
|
至此基本功能就写完啦。但是太简陋了对不对,还是要再加点装饰。
重写 logger
函数,区分 stdout
和 stderr
1 2 3 4 5 6 7 8 9 10 11 12
| let logInfo = fs.createWriteStream('./stdout.log'); let logError = fs.createWriteStream('./stderr.log');
let Logger = {};
Logger.info = (message) => { logInfo.write('[INFO] ' + message); }
Logger.error = (message) => { logError.write('[ERROR] ' + message); }
|
感觉还是少了点什么…日期?
1 2 3
| Logger.info = (message) => { logInfo.write(new Date().toISOString() + ' [INFO] ' + message + '\n'); }
|
嗯嗯。这就像样了。把代码整合起来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| const fs = require('fs');
let logInfo = fs.createWriteStream('./stdout.log'); let logError = fs.createWriteStream('./stderr.log');
let Logger = {};
Logger.info = (message) => { logInfo.write(new Date().toISOString() + ' [INFO] ' + message + '\n'); } Logger.error = (message) => { logError.write(new Date().toISOString() + ' [ERROR] ' + message + '\n'); }
module.exports = Logger;
|
需要用时
1
| Logger.info('This is an information.');
|
现在看对应的 stdout.log
文件就有相应内容啦。
1 2
| ~> tail -f stdout.log 2018-11-18T10:52:57.333Z [INFO] This is an information.
|
不够刺激?
1 2 3
| [...Array(10000)].forEach((item, index) => { Logger.info('Hello! ' + index); });
|
1 2 3 4 5 6 7 8 9 10 11 12
| ~> tail -f stdout.log ... 2018-11-18T10:58:30.661Z [INFO] Hello! 9990 2018-11-18T10:58:30.661Z [INFO] Hello! 9991 2018-11-18T10:58:30.661Z [INFO] Hello! 9992 2018-11-18T10:58:30.661Z [INFO] Hello! 9993 2018-11-18T10:58:30.661Z [INFO] Hello! 9994 2018-11-18T10:58:30.661Z [INFO] Hello! 9995 2018-11-18T10:58:30.661Z [INFO] Hello! 9996 2018-11-18T10:58:30.661Z [INFO] Hello! 9997 2018-11-18T10:58:30.661Z [INFO] Hello! 9998 2018-11-18T10:58:30.661Z [INFO] Hello! 9999
|
搞定(┌・ω・)┌超简单的吧。