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创建优美的页面滑动块效果 - Glider.js
Sep 27 Javascript
JavaScript面象对象设计
Apr 28 Javascript
jquery高级编程的最佳实践详解
Mar 23 Javascript
jQuery 插件开发指南
Nov 14 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
Apr 24 Javascript
JavaScipt选取文档元素的方法(推荐)
Aug 05 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
Aug 10 Javascript
Vue用v-for给src属性赋值的方法
Mar 03 Javascript
Vue和React组件之间的传值方式详解
Jan 31 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
Jun 22 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
Apr 11 Javascript
jQuery实现移动端图片上传预览组件的方法分析
May 01 jQuery
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实现中文圆形印章特效
2015/06/19 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
PHP+JQuery+Ajax实现分页方法详解
2016/08/06 PHP
PHP实现多关键字加亮功能
2016/10/21 PHP
谈谈JavaScript类型系统之Math
2016/01/06 Javascript
实例详解ECMAScript5中新增的Array方法
2016/04/05 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
微信小程序前端源码逻辑和工作流
2016/09/25 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
跟老齐学Python之一个免费的实验室
2014/09/14 Python
Python常用模块介绍
2014/11/21 Python
Python中的两个内置模块介绍
2015/04/05 Python
Python实现队列的方法
2015/05/26 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
python 批量解压压缩文件的实例代码
2019/06/27 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
python django中8000端口被占用的解决
2019/12/17 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
HTML5中使用postMessage实现两个网页间传递数据
2016/06/22 HTML / CSS
医务工作者先进事迹材料
2014/01/26 职场文书
俄语专业职业生涯规划
2014/02/26 职场文书
市场调查策划方案
2014/06/10 职场文书
节水口号标语
2014/06/19 职场文书
我的梦想演讲稿1000字
2014/08/21 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
会议室使用管理制度
2015/08/06 职场文书
mysql知识点整理
2021/04/05 MySQL
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python
【海涛教你打DOTA】黑鸟第一视角解说
2022/04/01 DOTA
Redis实现一个账号只能登录一个设备
2022/04/19 Redis