前一篇Node.js日志框架选型比較:Winston

Bunyan

Bunyan(by Trent Mick)是另外一个值得考虑的日志框架,以稍微不同的方式处理结构化,机器可读性被重点对待。

其结果是,bunyan每行日志记录实际上就是JSON.stringify的一个输出。

安装(Installation)

npm install bunyan

使用(Usage)

var bunyan= require('bunyan');
var log=bunyan.createLogger({name:'myapp'});
log.info('hi');
log.warn({lang:'fr'}, 'au revoir');
输出:
{"name":"myapp","hostname":"pwony-2","pid":12616,"level":30,"msg":"hi","time":"2014-05-26T17:58:32.835Z","v":0}
{"name":"myapp","hostname":"pwony-2","pid":12616,"level":40,"lang":"fr","msg":"au revoir","time":"2014-05-26T17:58:32.837Z","v":0}
你能够看到Bunyan缺省情况下的日志输出对人而言可读性不好,可是更加符合现代计算机的数据处理格式,在输出到其它储存时无需额外的格式化。
只是我们人类,这样的格式的信息还是不方便阅读,有一个bunyan命令行工具以标准命令行输入方式处理JSON数据。以下是一个输出经过bunyan管道处理后的样例:
node example.js |bunyan
产生以下输出:
[2014-05-26T18:03:40.820Z]  INFO:myapp/13372 on pwony-2: hi
[2014-05-26T18:03:40.824Z]  WARN: myapp/13372on pwony-2:au revoir(lang=fr)
这样做的主要优点是不须要对开发环境进行又一次配置,仅仅要把输出传递给bunyan管道处理就可以。

JSON

Bunyan和Winston之间一个关键的差别是Bunyan能够处理复杂的上下文环境和对象。再看上面的样例:
log.warn({lang: 'fr'},'au revoir');
{"name":"myapp","hostname":"pwony-2","pid":12616,"level":40,"lang":"fr","msg":"au revoir","time":"2014-05-26T17:58:32.837Z","v":0}
你能够看到bunyan把语言參数合并进了日志结果。再看看以下这个:
log.info(user, 'registered');
log.info({user:user},'registered');
Which produces:
{"name":"myapp","hostname":"pwony-2","pid":14837,"level":30,"username":"alex","email":"...@gmail.com","msg":"registered","time":"2014-05-26T18:27:43.530Z","v":0}
{"name":"myapp","hostname":"pwony-2","pid":14912,"level":30,"user":{"username":"alex","email":"...@gmail.com"},"msg":"registered","time":"2014-05-26T18:28:19.874Z","v":0}
通过punyan管道处理后:
[2014-05-26T18:28:42.455Z]  INFO: myapp/14943 on pwony-2: registered (username=alex,email=...@gmail.com)
[2014-05-26T18:28:42.457Z]  INFO: myapp/14943on pwony-2:registered
    user:{
      "username": "alex",
      "email":"...@gmail.com"
    }
当我们使用子日志(Child Loggers)时,这样的处理方式的美妙之处将表露无遗。

子日志(Child Loggers)

Bunyan有一个子日志的概念,这同意为你的应用程序的某个子组件指定日志实例。

也即是。创建一个新的日志实例使得能够处理额外的字段。

子日志通过log.child(...)方法创建。这为记录系统、请求以及简单函数这些不同作用域的组件日志带来极大的方便。
如果你想把请求ID记入该请求范围内的全部日志中,这样你能够把这些日志关联绑定在一起。

varbunyan= require('bunyan');
var log = bunyan.createLogger({name:'myapp'});
 
app.use(function(req, res,next) {
  req.log=log.child({reqId: uuid()});
  next();
});
 
app.get('/', function(req, res) {
  req.log.info({user:...});
});
req.log日志实例将总是把它的上下文传递给log.child()函数并和全部兴许调用合并,输出例如以下:
{"name":"myapp","hostname":"pwony-2","pid":14837,"level":30,"reqId":"XXXX-XX-XXXX","user":"...@gmail.com","time":"2014-05-26T18:27:43.530Z","v":0}

序列化器(Serializers)

Bunyan在格式化整个对象时有两个问题:
1循环引用(Circular references)。Winston在这里更聪明些,会检測发生的循环情况。
2多余的数据(Unwanted noises). 我认为在Bunyan中对象是第一位的。所以非常easy形成习惯把对象直接dump到日志中。
为了处理这两个问题,Bunyan有一个序列化器的概念,基本上就是一些转换函数,把对象转换为部分字段的输出格式:
function reqSerializer(req) {
  return{
    method:req.method,
    url: req.url,
    headers: req.headers
  }
}
 
var log = bunyan.createLogger({name:'myapp',serializers:{req: reqSerializer}});
log.info({req:req});
这样就仅仅记录我们感兴趣的请求的方法、url和头部字段。

流(Streams)

Bunyan流的概念和Winston中的传输(transporters)概念一样 – 发送您的日志到一些地方用来显示和存储。
Bunyan使用具有一些额外属性的可写流接口。

一个Bunyan日志记录器实例拥有1个或多个指定流选项的流:
var log=bunyan.createLogger({
  name: "foo",
  streams:[
    {
      stream: process.stderr,
      level: "debug"
    },
    ...
  ]

});

怎样选择

Winston和Bunyan都是非常成熟的两个框架,Winston有一个强大的社区支持,而Bunyan使得日志的进一步系统分析处理非常方便。
两个系统怎样选择的关键因素是“是否能和你的应用系统方便的集成”

by iefreer - founder of techbrood.com

Node.js日志框架选型比較:Bunyan的更多相关文章

  1. Node.js日志框架选型比較:Winston

    日志对于问题定位.调试,系统性能调优至关重要,尤其是系统复杂以及在线执行的情况下. 好的开发框架都会有一个可开启关闭/可配置记录级别的日志系统.我们从下面几个方面来做选型: 1. 每行日志都须要有准确 ...

  2. 强大的 Node.js Web 框架 - Daze.js

    去年年初对 Node.js 比较感兴趣,也用了很多 Node.js 的框架,但是开发体验不是特别好,我之前也是后端转前端,然后再接触 Node.js ,所以用过挺多的服务端框架,相对js而言,设计一款 ...

  3. Node.js Express 框架

    Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...

  4. 全端开发必备!10个最好的 Node.js MVC 框架

      Node.js 是最流行的 JavaScript 服务端平台,它允许建立可扩展的 Web 应用程序.Node.js 包含不同类型的框架,如 MVC 框架.全栈框架.REST API  以及大量的服 ...

  5. Koa – 更加强大的下一代 Node.js Web 框架

    Koa 是 Express 的开发团队设计的下一代 Web 框架,其目的是为 Web 应用程序提供更小,更具表现力,更坚实的基础.Koa 没有核捆绑任何中间件,并提供了一​​套优雅的方法,使服务器端开 ...

  6. 【360开源】thinkjs:基于Promise的Node.js MVC框架 (转)

    thinkjs是360奇舞团开源的一款Node.js MVC框架,该框架底层基于Promise来实现,很好的解决了Node.js里异步回调的问题.360奇舞团(奇虎75Team),是奇虎360公司We ...

  7. Node.js Express框架

    Express 介绍 Express是一个最小的,灵活的Node.js Web应用程序框架,它提供了一套强大的功能来开发Web和移动应用程序. 它有助于基于Node Web应用程序的快速开发.下面是一 ...

  8. 十款最佳Node.js MVC框架

    十款最佳Node.js MVC框架摘要:Node.js是JavaScript中最为流行的框架之一,易于创建可扩展的Web应用.本文分享十款最佳的JavaScript框架. Node.js是JavaSc ...

  9. Node.js的框架-express

    Node.js的框架 express 是第三方的 express const express=require('express'); const app=express(); const PORT=3 ...

随机推荐

  1. 50行python代码实现个代理server(你懂的)

    之前遇到一个场景是这种: 我在自己的电脑上须要用mongodb图形client,可是mongodb的server地址没有对外网开放,仅仅能通过先登录主机A,然后再从A连接mongodbserverB. ...

  2. Android开发经验小知识点

    <1> 设置屏幕无标题栏 在AndroidManifest.xml设置: Android:theme="@android:style/Theme.NoTitleBar"

  3. Shelled-out Commands In Golang

    http://nathanleclaire.com/blog/2014/12/29/shelled-out-commands-in-golang/ Shelled-out Commands In Go ...

  4. C#中选中指定文件并读取类似ini文件的内容

    一.背景 由于项目中需要去读取设备的配置信息,配置文件的内容和INI配置文件的格式类似,所以可以按照INI文件的方式来处理.涉及如何打开一个文件,获取打开的文件的路径问题,并读取选中的文件里边的内容. ...

  5. Android 内存监测工具

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/幻影浪子 [博主导读]俗话说:工欲善其事必先利其器!我们先来了解下内存监测工具是怎么使用的?为内 ...

  6. 看好腾讯,鄙视百度(腾讯的核心竞争力,不是超过10亿的QQ的注册用户,也不是某一项产品、技术方面优势,而是“耐心”:懂得在合适的时间推出合适的产品。”)

    百度,自始至终只是一个低劣的模仿者,且一切向前看,完全违背了一个搜索引擎所应该遵循的基本原则.谁给的钱多就能搜着谁,这跟贩毒有什么区别? 腾讯也在模仿别人,但是,它是模仿然后超越.在中国互联网发展历史 ...

  7. LocationOnScreen-控件在手机屏幕中的位置坐标

    我们可以通过如下的方法获得某个控件在屏幕中的绝对坐标 代码如下: private int[] mHistoryDisplayButtonLocation; private int mHistoryDi ...

  8. 循环体(for/while)循环变量的设置

    1. 求滑动(移动)平均(moving average) double partialSum = 0; for (int i = 0; i < M-1; ++i) partialSum += A ...

  9. nuxt按需引入 element-UI、自定义主题色(终极按需引入)

    首先你要知道 nuxt.js怎么引入第三方插件 : 不多BB. 一.按需引入element-UI 第一步:安装 babel-plugin-component: npm install babel-pl ...

  10. Monkey (压力测试)-移动端手机压力测试工具 monkey以及monkeyrunner

    4. Monkey (压力测试) 这个是Android提供的系统工具.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进行压力测试.Monkey测试是一种 ...