Node.js 利用 console 输出日志文件的方法示例

作者:终端旅客

时间:2026-10-22

浏览:390

本文介绍如何在 Node.js 中将 console 日志输出到文件。通过创建 console.Console 实例并指定 fs.createWriteStream,可将标准输出和错误重定向至文件。此外,通过扩展 Date 对象添加 format 方法,为每条日志添加精确的时间戳,实现更完善的日志记录功能。

文章目录

Node.js 日志输出到文件的基础实现

在开发 Node.js 应用时,开发者通常习惯使用 console.log 在控制台打印日志信息。然而,这种输出方式仅限于控制台显示。在实际生产环境中,往往需要将关键信息持久化保存到日志文件中。实际上,借助 console 模块的功能,我们可以轻松实现将日志输出到指定文件的目的。本文将简要介绍这一实现方法。

首先,我们需要创建相应的处理文件,具体代码结构如下:


// index.js

let fs = require('fs');

let options = {
  flags: 'a',     // append模式
  encoding: 'utf8',  // utf8编码
};

let stdout = fs.createWriteStream('./stdout.log', options);
let stderr = fs.createWriteStream('./stderr.log', options);

// 创建logger
let logger = new console.Console(stdout, stderr);

for (let i = 0; i < 100; i++) {
  logger.log(`log message ${i}`);
  logger.error(`err message ${i}`);
}

在上述代码中,核心操作是创建了一个 console.Console 类的实例。该构造函数需要接收两个参数,分别代表标准输出流和标准错误输出流。在常规情况下,这两个参数对应 process.stdout 和 process.stderr。但在本例中,我们将这两个输出流替换为文件输出流,并指定了文件追加模式(append mode)。通过这种配置,程序即可将日志信息自动输出到指定的文件中。运行上述代码后,会在当前目录生成 stdout.log 和 stderr.log 两个日志文件。

生成的 stdout.log 文件内容示例如下:


log message 0
log message 1
log message 2
log message 3
log message 4
log message 5
log message 6
log message 7
log message 8
log message 9
log message 10
...

生成的 stderr.log 文件内容示例如下:


err message 0
err message 1
err message 2
err message 3
err message 4
err message 5
err message 6
err message 7
err message 8
err message 9
err message 10
...

为日志添加时间戳的格式化方案

观察上述日志内容,发现信息较为简单,缺乏时间信息,不太符合标准日志文件的规范。因此,我们需要为每条日志添加时间戳。首先,我们为 Date 对象扩展一个 format 原型方法,具体实现如下:


// 添加format方法
Date.prototype.format = function (format) {

  if (!format) {
    format = 'yyyy-MM-dd HH:mm:ss';
  }
  
  // 用0补齐指定位数
  let padNum = function (value, digits) {
    return Array(digits - value.toString().length + 1).join('0') + value;
  };

  // 指定格式字符
  let cfg = {
    yyyy: this.getFullYear(),             // 年
    MM: padNum(this.getMonth() + 1, 2),        // 月
    dd: padNum(this.getDate(), 2),           // 日
    HH: padNum(this.getHours(), 2),          // 时
    mm: padNum(this.getMinutes(), 2),         // 分
    ss: padNum(this.getSeconds(), 2),         // 秒
    fff: padNum(this.getMilliseconds(), 3),      // 毫秒
  };

  return format.replace(/([a-z]|[A-Z])(\1)*/ig, function (m) {
    return cfg[m];
  });
}

随后,我们需要对前面的主程序文件进行改写,以集成时间戳功能:


// index.js

let fs = require('fs');

let options = {
  flags: 'a',     // append模式
  encoding: 'utf8',  // utf8编码
};

let stdout = fs.createWriteStream('./stdout.log', options);
let stderr = fs.createWriteStream('./stderr.log', options);

// 创建logger
let logger = new console.Console(stdout, stderr);

// 添加format方法
Date.prototype.format = function (format) {

  if (!format) {
    format = 'yyyy-MM-dd HH:mm:ss';
  }
  
  // 用0补齐指定位数
  let padNum = function (value, digits) {
    return Array(digits - value.toString().length + 1).join('0') + value;
  };

  // 指定格式字符
  let cfg = {
    yyyy: this.getFullYear(),             // 年
    MM: padNum(this.getMonth() + 1, 2),        // 月
    dd: padNum(this.getDate(), 2),           // 日
    HH: padNum(this.getHours(), 2),          // 时
    mm: padNum(this.getMinutes(), 2),         // 分
    ss: padNum(this.getSeconds(), 2),         // 秒
    fff: padNum(this.getMilliseconds(), 3),      // 毫秒
  };

  return format.replace(/([a-z]|[A-Z])(\1)*/ig, function (m) {
    return cfg[m];
  });
}

for (let i = 0; i < 100; i++) {

  let time = new Date().format('yyyy-MM-dd HH:mm:ss.fff');

  logger.log(`[${time}] - log message ${i}`);
  logger.error(`[${time}] - err message ${i}`);
}

重新运行程序后,再次查看生成的两个日志文件内容。

此时,stdout.log 的内容已更新为:


[2018-04-27 07:30:54.309] - log message 0
[2018-04-27 07:30:54.312] - log message 1
[2018-04-27 07:30:54.312] - log message 2
[2018-04-27 07:30:54.312] - log message 3
[2018-04-27 07:30:54.312] - log message 4
[2018-04-27 07:30:54.312] - log message 5
[2018-04-27 07:30:54.312] - log message 6
[2018-04-27 07:30:54.312] - log message 7
[2018-04-27 07:30:54.312] - log message 8
[2018-04-27 07:30:54.312] - log message 9
[2018-04-27 07:30:54.312] - log message 10
...

同时,stderr.log 的内容也相应更新为:


[2018-04-27 07:30:54.309] - err message 0
[2018-04-27 07:30:54.312] - err message 1
[2018-04-27 07:30:54.312] - err message 2
[2018-04-27 07:30:54.312] - err message 3
[2018-04-27 07:30:54.312] - err message 4
[2018-04-27 07:30:54.312] - err message 5
[2018-04-27 07:30:54.312] - err message 6
[2018-04-27 07:30:54.312] - err message 7
[2018-04-27 07:30:54.312] - err message 8
[2018-04-27 07:30:54.312] - err message 9
[2018-04-27 07:30:54.312] - err message 10
...

至此,一个简单的带有时间戳的日志输出功能便已完成。

参考资料:https://nodejs.org/api/console.html

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章