Node.js日志框架选型比較:Bunyan
前一篇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"
},
...
]
});
怎样选择
by iefreer - founder of techbrood.com
Node.js日志框架选型比較:Bunyan的更多相关文章
- Node.js日志框架选型比較:Winston
日志对于问题定位.调试,系统性能调优至关重要,尤其是系统复杂以及在线执行的情况下. 好的开发框架都会有一个可开启关闭/可配置记录级别的日志系统.我们从下面几个方面来做选型: 1. 每行日志都须要有准确 ...
- 强大的 Node.js Web 框架 - Daze.js
去年年初对 Node.js 比较感兴趣,也用了很多 Node.js 的框架,但是开发体验不是特别好,我之前也是后端转前端,然后再接触 Node.js ,所以用过挺多的服务端框架,相对js而言,设计一款 ...
- Node.js Express 框架
Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...
- 全端开发必备!10个最好的 Node.js MVC 框架
Node.js 是最流行的 JavaScript 服务端平台,它允许建立可扩展的 Web 应用程序.Node.js 包含不同类型的框架,如 MVC 框架.全栈框架.REST API 以及大量的服 ...
- Koa – 更加强大的下一代 Node.js Web 框架
Koa 是 Express 的开发团队设计的下一代 Web 框架,其目的是为 Web 应用程序提供更小,更具表现力,更坚实的基础.Koa 没有核捆绑任何中间件,并提供了一套优雅的方法,使服务器端开 ...
- 【360开源】thinkjs:基于Promise的Node.js MVC框架 (转)
thinkjs是360奇舞团开源的一款Node.js MVC框架,该框架底层基于Promise来实现,很好的解决了Node.js里异步回调的问题.360奇舞团(奇虎75Team),是奇虎360公司We ...
- Node.js Express框架
Express 介绍 Express是一个最小的,灵活的Node.js Web应用程序框架,它提供了一套强大的功能来开发Web和移动应用程序. 它有助于基于Node Web应用程序的快速开发.下面是一 ...
- 十款最佳Node.js MVC框架
十款最佳Node.js MVC框架摘要:Node.js是JavaScript中最为流行的框架之一,易于创建可扩展的Web应用.本文分享十款最佳的JavaScript框架. Node.js是JavaSc ...
- Node.js的框架-express
Node.js的框架 express 是第三方的 express const express=require('express'); const app=express(); const PORT=3 ...
随机推荐
- Android eclipse 提示java代码 快捷键
1.提示java代码能够用ALT+/ 键就能够了(前提是你要把你须要的类或方法的首字母打出来).我添加的部分:仅仅要输入sysout,然后alt+/键就能够输出System.out.prinln(), ...
- 各种join一目了然: join 、inner join、left join 、right join、full join
各种join一幅图一目了然 一下每幅图都是指: A * join B on A.id = B.in 这个帖子也非常形象.比較好:http://www.phpddt.com/db/inner_join- ...
- 热点共享SS网络
# 测试系统: Ubuntu 16.04 LTS-lxde-ARM # ***-libev 安装脚本源于 秋水逸冰: https://teddysun.com/358.html # ss-tproxy ...
- js10---call方法总结
<html> <body> <script type="text/javascript"> function Obj(x, y){ this.x ...
- C# 反射具体解释
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...
- FFmpegh.264解码
- (int)DecodeH264Frames: (unsigned char*)inputBuffer withLength:(int)aLength { ; ; av_init_packet(&a ...
- 1. vue环境搭建和配置
const 相对于 var # 全局安装 vue-cli install可以简写成i 1.$ npm install --global vue-cli # 创建一个基于 webpack 模板的新项 ...
- 洛谷 P1691 有重复元素的排列问题
P1691 有重复元素的排列问题 题目描述 设R={r1,r2,……,rn}是要进行排列的n个元素.其中元素r1,r2,……,rn可能相同.使设计一个算法,列出R的所有不同排列. 给定n以及待排列的n ...
- JPA学习笔记(11)——使用二级缓存
一级缓存 查询两次id为1的user User user1 = entityManager.find(User.class, 1); User user2 = entityManager.find(U ...
- 单位转换 inch mm mil
从上面看:英寸(inch)是最大的单位 其次是毫米(mm) 再次是密耳(mil)