关于日志调试的debug方式
发布于 6 年前 作者 i5ting 4491 次浏览 来自 分享

翻出一篇很早之前写的,备忘一下

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请求,结果如下

Screen Shot 2017-08-28 at 12.36.01 AM.png

很明显,这样的debug是非常方便的。如果业务极其复杂呢?你是不是可以指定require(‘debug’)(‘http1’)、require(‘debug’)(‘http2’)类似的方式来进行模块化debug呢?当然是可以的。你也可以通过 * 等正则通配符来匹配,其功能异常的强大、实用,故而很多模块都会采用它,是必备必会模块。

5 回复

是的。几乎所有模块都会用到 debug。 还记得有一次debug更新了主干发布了一个require直接会报错的版本,整个nodejs社区都炸了。 https://github.com/visionmedia/debug/pull/353

util.debuglog其实也一样,不过更近一步而已,确实是好用啊

有学习了一个新技能

没记错的话,社区的 debug 可能先于内核里的 util debuglog 出现

回到顶部