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 ...
随机推荐
- iOS应用笔记之git的本地使用
什么是git (1)什么是git >git是一个 "分布式"的版本号控制工具 >git的作者是Linux之父:Linus Benedict Torvalds,当初开发g ...
- 玲珑杯 Round 19 B Buildings (RMQ + 二分)
DESCRIPTION There are nn buildings lined up, and the height of the ii-th house is hihi. An inteval [ ...
- BZOJ4196: [Noi2015]软件包管理器(树链剖分)
Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...
- 词向量 word2vec
看的这一篇的笔记 http://licstar.net/archives/328 看不太懂. 要学的话,看这里吧,这里把一些资料做了整合: http://www.cnblogs.com/wuzhitj ...
- Xcode6:No architectures to compile for(ONLY_ACTIVE_ARCH=YES...)
1.问题描写叙述 Xcode6真机測试旧project,不能执行,报错例如以下: 2.解决方式 问题非常明显,当前的执行模式设置了ONLY_ACTIVE_ARCH为Yes,当时的project的Val ...
- 79.cgi硬盘查询个人信息
运行截图: 把cgi编码转为char*类型 //把cgi编码转为char*类型 char* change(char *str) { //分配内存 ); //x是tempstr的下标,y是str的下标 ...
- 90.#define高级用法
define把参数变成字符串 #define f(x) printf("%s",#x); define连接两个字符串 #define a(x) a##x define把参数变成字符 ...
- php编译参数注释
1. 指定安装路径 --prefix=PREFIX 2. 指定运行用户 --with-fpm-user=nginx 3. 指定运行组 --with-fpm-group=nginx 3.与'--pref ...
- css实现水波纹效果
1. HTML 代码: <div class="example"> <div class="dot"></div> < ...
- input表单验证(全面)
1.英文字母 1 <script type="text/javascript"> 2 //验证只能是字母 3 function checkZm(zm){ 4 var z ...