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事件模型代码
Jul 01 Javascript
WordPress 照片lightbox效果的运用几点
Jun 22 Javascript
如何判断元素是否为HTMLElement元素
Dec 06 Javascript
javascript去除空格方法小结
May 21 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
Apr 12 Javascript
BootStrap中的table实现数据填充与分页应用小结
May 26 Javascript
在vue中给列表中的奇数行添加class的实现方法
Sep 05 Javascript
微信小程序实现手势滑动效果
Aug 26 Javascript
jquery实现烟花效果(面向对象)
Mar 10 jQuery
Vue $emit()不能触发父组件方法的原因及解决
Jul 28 Javascript
js通过canvas生成图片缩略图
Oct 02 Javascript
一定要知道的 25 个 Vue 技巧
Nov 02 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
德生BCL3000的电路分析和打磨
2021/03/02 无线电
php 静态变量与自定义常量的使用方法
2010/01/26 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
PHP图片水印类的封装
2017/07/06 PHP
PHP钩子与简单分发方式实例分析
2017/09/04 PHP
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
微信分享的标题、缩略图、连接及描述设置方法
2014/10/14 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
js Canvas绘制圆形时钟教程
2017/02/06 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
angularJs自定义过滤器实现手机号信息隐藏的方法
2018/10/08 Javascript
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
Python中int()函数的用法浅析
2017/10/17 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
2019/09/25 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
2020/04/20 Python
python如何更新包
2020/06/11 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
Michael Kors美国官网:美式奢侈生活风格的代表
2016/11/25 全球购物
美国在线购物频道:Shop LC
2019/04/21 全球购物
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
学生个人求职自荐信格式
2013/09/23 职场文书
公司面试感谢信
2014/02/01 职场文书
党员违纪检讨书
2014/02/18 职场文书
三提三创主题教育活动查摆整改措施
2014/10/25 职场文书
贫困生助学金感谢信
2015/01/21 职场文书
应急管理工作总结2015
2015/05/04 职场文书
2016年中秋祝酒词
2015/11/26 职场文书
深入浅析Redis 集群伸缩原理
2021/05/15 Redis
Appium中scroll和drag_and_drop根据元素位置滑动
2022/02/15 Python