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 相关文章推荐
JScript的条件编译
May 29 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
Sep 09 Javascript
SWFObject基本用法实例分析
Jul 20 Javascript
jQuery实现文本框邮箱输入自动补全效果
Nov 17 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
Dec 18 Javascript
PHP实现记录代码运行时间封装类实例教程
May 08 Javascript
解决Extjs下拉框不显示的问题
Jun 21 Javascript
js推箱子小游戏步骤代码解析
Jan 10 Javascript
jQuery实现常见的隐藏与展示列表效果示例
Jun 04 jQuery
layui-laydate时间日历控件使用方法详解
Nov 15 Javascript
JavaScript实现简单进度条效果
Mar 25 Javascript
JS自定义右键菜单实现代码解析
Jul 16 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
PHP版自动生成文章摘要
2008/07/23 PHP
2个比较经典的PHP加密解密函数分享
2014/07/01 PHP
PHP进行批量任务处理不超时的解决方法
2016/07/11 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
2017/04/03 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
语义化 H1 标签
2008/01/14 Javascript
js 回车提交表单两种实现方法
2012/12/31 Javascript
使用jQuery validate 验证注册表单实例演示
2013/03/25 Javascript
js控制iframe的高度/宽度让其自适应内容
2014/04/09 Javascript
Node.js编程中客户端Session的使用详解
2015/06/23 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
详解js中==与===的区别
2017/01/08 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
NodeJS使用Range请求实现下载功能的方法示例
2018/10/12 NodeJs
JS实现打砖块游戏
2020/02/14 Javascript
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
PyQT实现多窗口切换
2018/04/20 Python
使用11行Python代码盗取了室友的U盘内容
2018/10/23 Python
python调用自定义函数的实例操作
2019/06/26 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
python爬虫增加访问量的方法
2019/08/22 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
大学校园毕业自我鉴定
2014/01/15 职场文书
三年级科学教学反思
2014/01/29 职场文书
庆元旦迎新年广播稿
2014/02/18 职场文书
离职信范文
2015/06/23 职场文书
Pycharm连接远程服务器并远程调试的全过程
2021/06/24 Python
关于Python使用turtle库画任意图的问题
2022/04/01 Python
Redis全局ID生成器的实现
2022/06/05 Redis