翻出一篇很早之前写的,备忘一下
debug
对于日志调试有很多种方式,最简单是console.log,在控制台直接打印出日志。但往往这样是不够用的,有时需要dump某些对象的详细信息。
- 方式1:可以通过console.dir()语句来方便的完成。
- 方式2:通过手工编写JavaScript代码可以完成这一工作:针对对象的属性进行循环,将循环到的每一个属性值打印出来,或者使用 util.inspect 获取更多详情。
无论哪种都是比较常用的方式,其实在Node SDK里还内置了util.debuglog方法的,如果不看node源码,以前还真没用过
const util = require('util');
const debuglog = util.debuglog('foo');
debuglog('hello from foo [%d]', 123);
其源码也很有意思
var debugs = {};
var debugEnviron;
function debuglog(set) {
if (debugEnviron === undefined) {
debugEnviron = new Set(
(process.env.NODE_DEBUG || '').split(',').map((s) => s.toUpperCase()));
}
set = set.toUpperCase();
if (!debugs[set]) {
if (debugEnviron.has(set)) {
var pid = process.pid;
debugs[set] = function() {
var msg = exports.format.apply(exports, arguments);
console.error('%s %d: %s', set, pid, msg);
};
} else {
debugs[set] = function() {};
}
}
return debugs[set];
}
根据环境变量中的NODE_DEBUG来判断是否为Debug环境,如果是,就通过console.error来输出。所以上面的代码要这样执行
$ export NODE_DEBUG=foo && node debuglog.js
FOO 45417: hello from foo [123]
但是能不能,让debug更灵活呢?比如增加颜色,同时支持浏览器和node,支持更为宽泛的环境变量匹配?于是tj就写了debug这个模块。
A tiny JavaScript debugging utility modelled after Node.js core’s debugging technique. Works in Node.js and web browsers.
$ npm install --save debug
在各种node项目里,经常会见到
var debug = require('debug')('http')
, http = require('http')
, name = 'My App';
debug('booting %o', name);
http.createServer(function(req, res){
debug(req.method + ' ' + req.url);
res.end('hello\n');
}).listen(3000, function(){
debug('listening');
});
此时,你需要先通过指定DEBUG变量为http(上面debug后面的参数),然后再浏览器里访问http://127.0.0.1:3000/aa,此时会触发对应的http请求,结果如下
很明显,这样的debug是非常方便的。如果业务极其复杂呢?你是不是可以指定require(‘debug’)(‘http1’)、require(‘debug’)(‘http2’)类似的方式来进行模块化debug呢?当然是可以的。你也可以通过 *
等正则通配符来匹配,其功能异常的强大、实用,故而很多模块都会采用它,是必备必会模块。
是的。几乎所有模块都会用到 debug。 还记得有一次debug更新了主干发布了一个require直接会报错的版本,整个nodejs社区都炸了。 https://github.com/visionmedia/debug/pull/353
@alsotang tj 光环
util.debuglog其实也一样,不过更近一步而已,确实是好用啊
有学习了一个新技能
没记错的话,社区的 debug 可能先于内核里的 util debuglog 出现