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 相关文章推荐
Div Select挡住的解决办法
Aug 07 Javascript
设置下载不需要倒计时cookie(倒计时代码)
Nov 19 Javascript
jQuery EasyUI 开源插件套装 完全替代ExtJS
Mar 24 Javascript
jquery 学习之二 属性相关
Nov 23 Javascript
jQuery UI Datepicker length为空或不是对象错误的解决方法
Dec 19 Javascript
node.js中的fs.realpathSync方法使用说明
Dec 16 Javascript
JS实现单行文字不间断向上滚动的方法
Jan 29 Javascript
jQuery基于图层模仿五星星评价功能的方法
May 07 Javascript
基于zepto的移动端轻量级日期插件--date_picker
Mar 04 Javascript
详解微信小程序 wx.uploadFile 的编码坑
Jan 23 Javascript
vue.js开发环境安装教程
Mar 17 Javascript
在webstorm中配置less的方法详解
Sep 25 Javascript
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
《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
2011/05/09 PHP
php 文件上传类代码
2011/08/06 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
PHPExcel内存泄漏问题解决方法
2015/01/23 PHP
php数组指针操作详解
2017/02/14 PHP
PHP生成腾讯云COS接口需要的请求签名
2018/05/20 PHP
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
React 组件转 Vue 组件的命令写法
2018/02/28 Javascript
基于Vue实现的多条件筛选功能的详解(类似京东和淘宝功能)
2019/05/07 Javascript
layui form.render('select', 'test2') 更新渲染的方法
2019/09/27 Javascript
pyenv命令管理多个Python版本
2017/03/26 Python
Django自定义用户认证示例详解
2018/03/14 Python
python3中函数参数的四种简单用法
2018/07/09 Python
使用tensorflow实现线性回归
2018/09/08 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
python协程之动态添加任务的方法
2019/02/19 Python
Python常见数字运算操作实例小结
2019/03/22 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
python selenium自动化测试框架搭建的方法步骤
2020/06/14 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
简单而又朴实的个人求职信分享
2013/12/12 职场文书
内刊编辑求职自荐书范文
2014/02/19 职场文书
小学一年级学生评语
2014/04/22 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
代办出身证明书
2014/10/21 职场文书
思想作风建设心得体会
2014/10/22 职场文书
2015世界地球日活动总结
2015/02/09 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
道歉短信大全
2015/05/12 职场文书