Pino:为何大多数前端开发如此钟情它?

今天给大家带来的主题是 Node.js 生态的日志记录框架 , 即 Pino 。话不多说 , 直接开始!
1.什么是 PinoPino 是一个强大的 Node.js 日志记录框架 , 拥有非常快的速度和非常全面的功能 , 同时因为性能优势它已经集成到了开源 Fastify Web 服务器中 。Pino 的多功能性还扩展到它易于与其他 Node.js Web 框架集成 , 使其成为可靠、灵活日志方案的首选 。

Pino:为何大多数前端开发如此钟情它?

文章插图
【Pino:为何大多数前端开发如此钟情它?】 
Pino 包括日志框架中预期的所有标准功能 , 例如:可自定义的日志级别、格式化选项和多个日志传输选项 。它的灵活性是其突出的特点之一 , 因为它可以轻松扩展以满足特定要求 , 从而使其成为广泛应用的首选 。
2.为什么选择 Pino当选择具体的日志方案时 , Node.js 生态有很多不错的可选项 。Pino 是一个历史悠久且非常流行的日志记录工具 , 在 Github 上拥有超过 11.5K star , NPM 周平均下载量达到了惊人的 3601k 。
Pino 提供了几个关键特性 , 使其非常适合在 Node.js 应用程序中使用:
  • 快速 :Pino 的设计目标是快速和轻便 , 并专注于性能 。它对日志消息使用二进制格式 , 这使其能够快速高效地生成日志输出 。字符串打印速度上:Pino 平均是 114.801ms , Bunyan 为377.434ms , Winston 为270.249ms , Bole 为172.690ms , Debug 为220.527ms , LogLevel 为222.802ms , 其中 Pino 最快 , 这个结论也同样适用于普通对象和深度嵌套对象(benchmark参考文末资料) 。
  • 结构化日志:Pino 以 JSON 格式记录消息 , 这样可以轻松解析、过滤和分析日志数据 , 使得搜索、可视化和分析日志数据以及将日志数据集成到其他系统变得更加容易 。
  • 易于扩展:Pino 被设计成高度可扩展的 , 并包含许多可用于添加附加功能的内置插件 , 例如:将日志数据写入文件或将日志数据发送到远程服务器 。
  • 低开销:Pino 是一个高效的 Node.js 日志库 , 因为它的资源利用率最低 。Pino 的日志记录过程逐渐积累消息 , 导致应用程序节流和每秒请求数减少 。节流是一种技术 , 其中触发连接到事件的函数在指定时间范围内仅运行一次 , 即使事件被触发多次也是如此 。
  • 传输 : Pino 提供了多种发送日志的选项 , 包括写入文件、在控制台中显示以及利用 Sentry、Azure Application Insights 和 CouchDB 等平台 。
要使用 Pino 也是非常简单 , 只需要首先安装相应的包 , 然后通过下面示例代码集成:
const logger = require('pino')();logger.info('hello world');const child = logger.child({ a: 'property' });child.info('hello child!');此时输出的日志格式如下:
{"level":30,"time":1531171074631,"msg":"hello world","pid":657,"hostname":"Davids-MBP-3.fritz.box"}{"level":30,"time":1531171082399,"msg":"hello child!","pid":657,"hostname":"Davids-MBP-3.fritz.box","a":"property"}3.Pino 与其他框架集成由于 HTTP 日志记录是 Pino 的主要用例 , 因此 Pino 对 Node.js Web 框架生态系统具有一流的支持 , 比如:Fastify、Express、Hapi、Restify、Koa 等等
Pino 与 FastifyFastify 是一个高度专注于以最少的开销和强大的插件架构提供最佳开发体验的 Web 框架 。它的灵感来自 Hapi 和 Express , 据目前所知 , 它是目前 Node.js 生态中最快的 Web 框架之一 。
Fastify web 框架默认集成了 Pino  , 只需将 Fastify 的 logger 选项设置为 true 并使用 request.log 或 reply.log 来记录与每个请求对应的日志消息:
const fastify = require('fastify')({logger: true,});// logger选项也可以设置为一个对象 , 该对象将作为 pino 选项对象直接传递 。fastify.get('/', async (request, reply) => {request.log.info('something');return { hello: 'world' };});fastify.listen({ port: 3000 }, (err) => {if (err) {fastify.log.error(err);process.exit(1);}});Pino 与 ExpressExpress 是用于 Node.js 的快速、极简主义的 Web 框架 , 目前在 NPM 周平均下载量达到了惊人的 27545k 。Express 的典型特征包括:


推荐阅读