IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    使用 fs.WriteStream 编写超简单的日志流

    Phoenix Nemo发表于 2020-09-14 04:20:20
    love 0

    虽然 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

    搞定(┌・ω・)┌超简单的吧。



沪ICP备19023445号-2号
友情链接