Node.JS
十个Node.js开发易犯错误之六:很少用日志
许多Node入门教程只是展示小的案例,里面使用了console.log,这给大家误以为这是一种日志实现方式。
你应该使用比console.log更好的日志,下面是原因:
- 没有必要为大型复杂对象使用 util.inspect;
- 内建序列化器如错误 请求和响应对象;
- 支持多个日志输出源控制;
- 自动包含主机名称, 流程id, 应用名称;
- 支持日志的多级别 (debug, info, error, fatal etc);
- 高级功能如日志文件的rotation等(每隔一段时间重新生成新日志,就日志打包压缩存储)
你可以从bunyan得到这些产品基本的日志模块。在其之上你也可以得到方便的CLI 部署工具。让我们看看这些案例如何使用:
var http = require('http'); var bunyan = require('bunyan');
var log = bunyan.createLogger({ name: 'myserver', serializers: { req: bunyan.stdSerializers.req, res: bunyan.stdSerializers.res } }); var server = http.createServer(function (req, res) { log.info({ req: req }, 'start request'); // <-- this is the guy we're testing res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello World\n'); log.info({ res: res }, 'done response'); // <-- this is the guy we're testing });
|
注意代码中日志写法,完整代码见Github
如果运行这段代码,我们会得到如下结果:
$ node server.js
{"name":"myserver","hostname":"MBP.local","pid":14304,"level":30,"msg":"server listening","time":"2014-11-16T11:30:13.263Z","v":0}
{"name":"myserver","hostname":"MBP.local","pid":14304,"level":30,"req":{"method":"GET","url":"/path?q=1#anchor","headers":{"x-hi":"Mom","host":"127.0.0.1:1337","connection":"keep-alive"},"
remoteAddress":"127.0.0.1","remotePort":61580},"msg":"start request","time":"2014-11-16T11:30:13.271Z","v":0} {"name":"myserver","hostname":"MBP.local","pid":14304,"level":30,"res":{"statusCode":200,"header":"HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nDate: Sun, 16 Nov 2014 11:30:13 GMT\r\nConnection: keep-alive\r\nTransfer-Encoding: chunked\r\n\r\n"},"msg":"done response","time":"2014-11-16T11:30:13.273Z","v":0}
在开发环境,最好使用CLI工具,如下图:

正如你看到,bunyan给你许多当前流程的有用信息,这些对于生产环境很重要,另外一个方便特性是你能将日志管道输出到一个或多个流。