[ Day 38 ] - winston 记录下发生的错误

常见的故事 ...

客户 : 系统出错了 , 可以帮忙修一下吗 【・ヘ・?】

工程师 : 我这边看起来很正常啊 ! 系统没有问题吧 ( ̄▽ ̄)ノ

客户 : 每天晚上要用的时候 , 系统都无法登入使用 (╯°Д°)╯ ┻━┻

工程师 : 现在还没晚上 , 今天晚上我再帮你看看 ಠ◡ಠ

...经过了无数个夜晚 , 工程师终於找出了 BUG 并将其修改 , 但是客户已经生气离开了 (╥_╥)


为何我们需要日志系统 ?

身为工程师 , 我们当然不希望每天晚上 , 烧肝处理这些 "系统出错"

之後 , 晚年需要吃 "人蔘" 来将 '小心肝' 给补回来 ,

既然这样 , 我们就需要在出错的时候 , 将错误讯息记录下来 (๑•̀ㅂ•́)و✧

利用这些错误讯息 , 我们可以即时修复 BUG , 不用晚上加班修复 ,

这时我们可以使用 "日志系统" - winston 来进行处理 (^-^*)/

下面 , 让我们好好了解一下这位护肝使者 - winston 吧 o(∩_∩)o


winston 介绍

winston 是由 Transport 与 level 所组成的一个 JS 日志套件

  • Transport : 输出器
  • level : 日志的输出等级

下方来一个简易的范例 -

// src/winston.js
const winston = require('winston');
 
const logger = winston.createLogger({
  // 当 transport 不指定 level 时 , 使用 info 等级
  level: 'info',
  // 设定输出格式
  format: winston.format.json(),
  // 设定此 logger 的日志输出器
  transports: [
    // 只有 error 等级的错误 , 才会将讯息写到 error.log 档案中
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    // info or 以上的等级的讯息 , 将讯息写入 combined.log 档案中
    new winston.transports.File({ filename: 'combined.log' }),
  ],
});
 
// 在开发模式时 , 将 log 讯息多输出到 console 中
if (process.env.NODE_ENV !== 'production') {
  logger.add(new winston.transports.Console({
    // simple 格式 : `${info.level}: ${info.message} JSON.stringify({ ...rest }) `
    format: winston.format.simple(),
  }));
}

// 下方为呼叫 log 的各种方式 
logger.log('info', 'Hello winston (・∀・)ノ');
logger.error('Here we got an error (ノ﹏ヽ)');
logger.log({
  level: 'verbose',
  message: 'here you will get some verbose'
});

上方程序执行後 , 会在同层目录中产生 error.logcombined.log 两个档案

─ src
   ├─  error.log
   ├─  combined.log
   └─  winston.js

而且 error.logcombined.log 的档案内容如下

  • conbined.log
{"level":"info","message":"Hello winston (・∀・)ノ"}
{"message":"Here we got an error (ノ﹏ヽ)","level":"error","service":"user-service"}
  • error.log
{"message":"Here we got an error (ノ﹏ヽ)","level":"error","service":"user-service"}

我们可以很明显地观察到虽然 logger.log 呼叫了 3 次 ,

conbined.log 档中只有 2 笔资料 ,

这是因为 level 等级的不同 , 造成输出的资料笔数不同 ,

我们常常会利用不同的 level 来将不同等级的资讯 , 纪录在不同档案中


winston 详细说明

level - 等级

winston 的日志等级 , 参考了 npm 的分级制度 , 共分为 7 个等级

{ 
  error: 0, 
  warn: 1, 
  info: 2, 
  http: 3,
  verbose: 4, 
  debug: 5, 
  silly: 6 
}

那何时会输出资讯给 Transport , 何时不会呢 ?

数值小的会输出给数值大的 , 下方为示意图

下方为呼叫 logger.log 的一些范例程序码

//
// Any logger instance
//
logger.log('silly', "127.0.0.1 - there's no place like home");
logger.log('debug', "127.0.0.1 - there's no place like home");
logger.log('verbose', "127.0.0.1 - there's no place like home");
logger.log('info', "127.0.0.1 - there's no place like home");
logger.log('warn', "127.0.0.1 - there's no place like home");
logger.log('error', "127.0.0.1 - there's no place like home");
logger.info("127.0.0.1 - there's no place like home");
logger.warn("127.0.0.1 - there's no place like home");
logger.error("127.0.0.1 - there's no place like home");

//
// Default logger
//
winston.log('info', "127.0.0.1 - there's no place like home");
winston.info("127.0.0.1 - there's no place like home");

Transport - 输出器

下方为官方预设提供的 Transport 我们可以按照需求 , 使用不同的 Transport

其他更为详尽的部分 , 请到 winston 官方文件 上查询 ^o^

参考资料

今年小弟第一次参加 `铁人赛` , 如文章有误 , 请各位前辈提出指正 , 感谢  <(_ _)>

<<:  数位时代的工程视角:思考大胆、策略精准,以科技革新法律的幕後推手

>>:  Data Extraction Services | Web Scraping | Data Mining Services & Solutions

找LeetCode上简单的题目来撑过30天啦(DAY5)

今天值接上菜,不闲聊 今日小菜 题号:182 标题:Duplicate Emails 难度:Easy...

Day20-自制下拉式选单_我就想要美美的

今天来弄一个自制的漂亮下拉式选单 首先下拉式选单,会有上面可以按的地方跟下方会弹出来的悬浮按钮 我这...

Python sort() sorted()

python有内建sort()与sorted()两种排序方法 以下将为各位详细介绍 sort() s...

Day36 参加职训(机器学习与资料分析工程师培训班),网站设计与网页工程技术

上午: 网站设计与网页工程技术 # 连接资料库 import sqlite3 import nump...

从听明牌,学习投资

获取明牌,并不一定就是赌徒心态;正确的观念是,应该是要先了解,人家何会推荐这只?是从基本面?消息面?...