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


Posted in Javascript onApril 27, 2018

通常我们在写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,以上的代码中,我们将这两个输出流改为了文件输出流,并指定为文件追加模式,这样即可将日志信息输出到指定的文件中去。运行上面的代码,会生成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

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

Javascript 相关文章推荐
JS 时间显示效果代码
Aug 23 Javascript
js获取元素在浏览器中的绝对位置
Jul 24 Javascript
JQuery与JSon实现的无刷新分页代码
Sep 13 Javascript
js格式化时间的方法
Dec 18 Javascript
servlet+jquery实现文件上传进度条示例代码
Jan 25 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
Jul 30 Javascript
javascript实现电脑和手机版样式切换
Nov 10 Javascript
bootstrap table表格插件之服务器端分页实例代码
Sep 12 Javascript
vue通过style或者class改变样式的实例代码
Oct 30 Javascript
highcharts.js数据绑定方式代码实例
Nov 13 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
Jul 18 Javascript
Vue实现圆环进度条的示例
Feb 06 Vue.js
vue拦截器实现统一token,并兼容IE9验证功能
Apr 26 #Javascript
使用Vue动态生成form表单的实例代码
Apr 26 #Javascript
Javascript的console['']常用输入方法汇总
Apr 26 #Javascript
r.js来合并压缩css文件的示例
Apr 26 #Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
Apr 26 #jQuery
Webpack打包字体font-awesome的方法示例
Apr 26 #Javascript
webpack配置打包后图片路径出错的解决
Apr 26 #Javascript
You might like
社区(php&amp;&amp;mysql)五
2006/10/09 PHP
FCKeditor添加自定义按钮
2008/03/27 PHP
php strrpos()与strripos()函数
2013/08/31 PHP
php常用的安全过滤函数集锦
2014/10/09 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
一些常用且实用的原生JavaScript函数
2010/09/08 Javascript
jquery 提示信息显示后自动消失的具体实现
2013/12/18 Javascript
javascript实现checkbox全选的代码
2015/04/30 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
2016/07/01 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
JavaScript输入分钟、秒倒计时技巧总结(附代码)
2017/08/17 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
2017/11/03 Javascript
JS计算距当前时间的时间差实例
2017/12/29 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
node.js学习笔记之koa框架和简单爬虫练习
2018/12/13 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
Python中实现从目录中过滤出指定文件类型的文件
2015/02/02 Python
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
Python操作列表之List.insert()方法的使用
2015/05/20 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
python不同版本的_new_不同点总结
2020/12/09 Python
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
迪卡侬波兰体育用品商店:Decathlon波兰
2020/03/31 全球购物
儿子婚宴答谢词
2014/01/09 职场文书
《蚂蚁和蝈蝈》教学反思
2014/02/24 职场文书
公司聘任书模板
2014/03/29 职场文书
给校长的建议书200字
2014/05/16 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
索尼ICF-36收音机评测
2022/04/30 无线电