本文介绍如何在 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。