客户 : 系统出错了 , 可以帮忙修一下吗 【・ヘ・?】
工程师 : 我这边看起来很正常啊 ! 系统没有问题吧 ( ̄▽ ̄)ノ
客户 : 每天晚上要用的时候 , 系统都无法登入使用 (╯°Д°)╯ ┻━┻
工程师 : 现在还没晚上 , 今天晚上我再帮你看看 ಠ◡ಠ
...经过了无数个夜晚 , 工程师终於找出了 BUG 并将其修改 , 但是客户已经生气离开了 (╥_╥)
身为工程师 , 我们当然不希望每天晚上 , 烧肝处理这些 "系统出错"
之後 , 晚年需要吃 "人蔘" 来将 '小心肝' 给补回来 ,
既然这样 , 我们就需要在出错的时候 , 将错误讯息记录下来 (๑•̀ㅂ•́)و✧
利用这些错误讯息 , 我们可以即时修复 BUG , 不用晚上加班修复 ,
这时我们可以使用 "日志系统" - winston 来进行处理 (^-^*)/
下面 , 让我们好好了解一下这位护肝使者 - winston 吧 o(∩_∩)o
winston
是由 Transport 与 level 所组成的一个 JS 日志套件
下方来一个简易的范例 -
// 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.log
与 combined.log
两个档案
─ src
├─ error.log
├─ combined.log
└─ winston.js
而且 error.log
与 combined.log
的档案内容如下
{"level":"info","message":"Hello winston (・∀・)ノ"}
{"message":"Here we got an error (ノ﹏ヽ)","level":"error","service":"user-service"}
{"message":"Here we got an error (ノ﹏ヽ)","level":"error","service":"user-service"}
我们可以很明显地观察到虽然 logger.log 呼叫了 3 次 ,
conbined.log 档中只有 2 笔资料 ,
这是因为 level 等级的不同 , 造成输出的资料笔数不同 ,
我们常常会利用不同的 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
其他更为详尽的部分 , 请到 winston 官方文件 上查询 ^o^
今年小弟第一次参加 `铁人赛` , 如文章有误 , 请各位前辈提出指正 , 感谢 <(_ _)>
<<: 数位时代的工程视角:思考大胆、策略精准,以科技革新法律的幕後推手
>>: Data Extraction Services | Web Scraping | Data Mining Services & Solutions
今天值接上菜,不闲聊 今日小菜 题号:182 标题:Duplicate Emails 难度:Easy...
今天来弄一个自制的漂亮下拉式选单 首先下拉式选单,会有上面可以按的地方跟下方会弹出来的悬浮按钮 我这...
python有内建sort()与sorted()两种排序方法 以下将为各位详细介绍 sort() s...
上午: 网站设计与网页工程技术 # 连接资料库 import sqlite3 import nump...
获取明牌,并不一定就是赌徒心态;正确的观念是,应该是要先了解,人家何会推荐这只?是从基本面?消息面?...