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 相关文章推荐
javascript 面向对象全新理练之继承与多态
Dec 03 Javascript
浅谈JS闭包中的循环绑定处理程序
Nov 09 Javascript
Javascript之BOM(window对象)详解
May 25 Javascript
深入解析JavaScript中的arguments对象
Jun 12 Javascript
js实现文字无缝向上滚动
Feb 16 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
Apr 22 Javascript
seajs实现强制刷新本地缓存的方法分析
Oct 16 Javascript
使用vue-infinite-scroll实现无限滚动效果
Jun 22 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
Aug 08 Javascript
Vue 3.x+axios跨域方案的踩坑指南
Jul 04 Javascript
小程序实现长按保存图片的方法
Dec 31 Javascript
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 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
用Flash图形化数据(一)
2006/10/09 PHP
PHP无限分类的类
2007/01/02 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
2014/08/21 PHP
php实现根据字符串生成对应数组的方法
2014/09/22 PHP
php中base_convert()进制数字转换函数实例
2014/11/20 PHP
php中动态调用函数的方法
2015/03/16 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
2015/10/21 PHP
在WordPress中使用wp-cron插件来设置定时任务
2015/12/10 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
JavaScript 全面解析各种浏览器网页中的JS 执行顺序
2009/02/17 Javascript
使用Javascript接收get传递的值的代码
2011/11/30 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
Bootstrap 附加导航(Affix)插件实例详解
2016/06/01 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
js获取css的各种样式并且设置他们的方法
2017/08/22 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
python中yield的用法详解——最简单,最清晰的解释
2019/04/04 Python
Python实现直播推流效果
2019/11/26 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
详解如何用HTML5 Canvas API控制图片的缩放变换
2016/03/22 HTML / CSS
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
荷兰家电销售网站:Welhof
2020/12/08 全球购物
一些PHP的面试题
2015/05/06 面试题
优秀研究生主要事迹
2014/06/03 职场文书
初中班级口号
2014/06/09 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
个人诉讼委托书范本
2014/10/17 职场文书
个人自荐书范文
2015/03/09 职场文书
《确定位置》教学反思
2016/02/18 职场文书
2019年鼓励无偿献血倡议书
2019/09/17 职场文书