您当前的位置:首页 > 电脑百科 > 程序开发 > 前端

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

时间:2023-06-02 14:55:12  来源:今日头条  作者:高级前端进阶

今天给大家带来的主题是 Node.js 生态的日志记录框架,即 Pino。话不多说,直接开始!

1.什么是 Pino

Pino 是一个强大的 Node.js 日志记录框架,拥有非常快的速度和非常全面的功能,同时因为性能优势它已经集成到了开源 Fastify Web 服务器中。 Pino 的多功能性还扩展到它易于与其他 Node.js Web 框架集成,使其成为可靠、灵活日志方案的首选。

 

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 与 Fastify

Fastify 是一个高度专注于以最少的开销和强大的插件架构提供最佳开发体验的 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 与 Express

Express 是用于 Node.js 的快速、极简主义的 Web 框架,目前在 NPM 周平均下载量达到了惊人的 27545k。Express 的典型特征包括:

  • 强大的路由
  • 专注于高性能
  • 超高测试覆盖率
  • 大量 HTTP 工具函数(重定向、缓存等)
  • 查看系统支持 14+ 模板引擎
  • 内容协商(Content negotiation)
  • 可执行以快速生成应用程序

Pino 与 Express 的集成也非常简单,比如下面的示例:

const app = require('express')();
const pino = require('pino-http')();
app.use(pino);
app.get('/', function (req, res) {
  req.log.info('something');
  res.send('hello world');
});

app.listen(3000);

Pino 和 Hapi 集成

Hapi 是开发人员信任的简单、安全的框架 以最小的开销和完整的开箱即用功能构建功能强大、可扩展的应用程序,在 NPM 上周平均下载量达到了 512k。

Pino 与 Hapi 的集成也非常简单,比如下面的示例:

'use strict';
require('make-promises-safe');
const Hapi = require('@hapi/hapi');
const Pino = require('hapi-pino');
async function start() {
  // 创建一个有host和port的服务器
  const server = Hapi.server({
    host: 'localhost',
    port: 3000,
  });
  // 添加路由
  server.route({
    method: 'GET',
    path: '/',
    handler: async function (request, h) {
      //request.log 是 HAPI 的标准日志记录方式
      request.log(['a', 'b'], 'Request into hello world');
      //也可以使用 pino 实例,这样会更快
      request.logger.info('In handler %s', request.path);
      return 'hello world';
    },
  });
  awAIt server.register(Pino);
  //也作为修饰的 API
  server.logger.info('another way for accessing it');
  //并通过 Hapi 标准日志系统
  server.log(['subsystem'], 'third way for accessing it');
  await server.start();
  return server;
}
start().catch((err) => {
  console.log(err);
  process.exit(1);
});

Pino 与 Restify

restify 是一个框架,利用 connect 风格的中间件来构建 REST API。Pino 与 Restify 的集成也非常简单,比如下面的示例:

const server = require('restify').createServer({ name: 'server' });
const pino = require('restify-pino-logger')();
server.use(pino);
server.get('/', function (req, res) {
  req.log.info('something');
  res.send('hello world');
});

server.listen(3000);

Pino 与 Koa

Koa 是用于 node.js 的富有表现力的 HTTP 中间件框架,使 Web 应用程序和 API 编写起来更轻松。 Koa 的中间件以类似堆栈的方式流动,允许开发者在下游执行操作然后在上游过滤和操作响应。Koa 没有打包任何中间件。

Pino 与 Koa 的集成也非常简单,比如下面的示例:

const Koa = require('koa');
const app = new Koa();
const pino = require('koa-pino-logger')();
app.use(pino);
app.use((ctx) => {
  ctx.log.info('something else');
  ctx.body = 'hello world';
});
app.listen(3000);

Pino 与 http

Pino 与 http 的集成也非常简单,比如下面的示例:

const http = require('http');
const server = http.createServer(handle);
const logger = require('pino-http')();
function handle(req, res) {
  logger(req, res);
  req.log.info('something else');
  res.end('hello world');
}

Pino 与 Nest

Nest 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架。 它基于现代 JAVAScript,使用 TypeScript 构建(保留与纯 JavaScript 的兼容性)并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式响应式编程)的元素。

本质上,Nest 是基于 Express,但也提供了与广泛的其他库的兼容性,例如 Fastify,允许轻松使用无数可用的第三方插件。Pino 与 Nest 的集成也非常简单,比如下面的示例:

import { NestFactory } from '@nestjs/core'
import { Controller, Get, Module } from '@nestjs/common'
import { LoggerModule, Logger } from 'nestjs-pino'

@Controller()
export class AppController {
  constructor(private readonly logger: Logger) {}
  @Get()
  getHello() {
    this.logger.log('something')
    return `Hello world`
  }
}
@Module({
  controllers: [AppController],
  imports: [LoggerModule.forRoot()]
})
class MyModule {}
async function bootstrap() {
  const app = await NestFactory.create(MyModule)
  await app.listen(3000)
}
bootstrap()

Pino 与 H3

H3 是为高性能和可移植性构建的最小 http 框架,NPM 上周平均下载量达到了 267K,具有以下典型特性:

  • ✔️ 可移植:在 Serverless、Workers 和 Node.js 中完美运行
  • ✔️ Minimal:小巧且支持 tree-shakable
  • ✔️ 现代:原生 Promise 支持
  • ✔️ 可扩展:附带一组可组合的实用程序,但可以扩展
  • ✔️ 路由支持:使用 unjs/radix3 进行超快速路由匹配
  • ✔️ 兼容:具有与 node/connect/express 兼容层

Pino 与 H3 的集成也非常简单,比如下面的示例:

import { createServer } from 'http';
import { createApp } from 'h3';
import pino from 'pino-http';
const app = createApp();
app.use(pino());
app.use('/', (req) => {
  req.log.info('something');
  return 'hello world';
});

createServer(app).listen(process.env.PORT || 3000);

4.本文总结

本文主要和大家介绍下 Node.js 生态的日志记录框架,即 Pino。相信通过本文的阅读,大家对 Pino 都会有一个初步的了解。

因为篇幅有限,文章并没有过多展开,如果有兴趣,可以在我的主页继续阅读,同时文末的参考资料提供了大量优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏!

 

参考资料

https://www.npmjs.com/package/h3

https://github.com/pinojs/pino

https://github.com/nestjs/nest

https://www.npmjs.com/package/fastify

https://www.npmjs.com/package/express

https://www.npmjs.com/package/@hapi/hapi

https://github.com/restify/node-restify

https://blog.logrocket.com/comparing-node-js-logging-tools/

https://www.npmjs.com/package/pino

https://github.com/pinojs/pino/blob/master/docs/benchmarks.md

封面图来自:
https://css-tricks.com/how-to-implement-logging-in-a-node-js-application-with-pino-logger/



Tags:Pino   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Pino:为何大多数前端开发如此钟情它?
今天给大家带来的主题是 Node.js 生态的日志记录框架,即 Pino。话不多说,直接开始!1.什么是 PinoPino 是一个强大的 Node.js 日志记录框架,拥有非常快的速度和非常全面的功能,同...【详细内容】
2023-06-02  Search: Pino  点击:(4019)  评论:(0)  加入收藏
15 分钟内,在 Kubernetes 上设置 Apache Pinot
了解如何在 Kubernetes 上安装 Pinot Control Plane,配置您的第一个 Pinot 集群,并深入了解控制平面功能。作为一名经验丰富的专业人士,我作为 Apache Druid k8s operator 的维...【详细内容】
2023-05-18  Search: Pino  点击:(349)  评论:(0)  加入收藏
▌简易百科推荐
20k级别前端是怎么使用LocalStorage的,想知道吗?
当咱们把咱们想缓存的东西,存在localStorage、sessionStorage中,在开发过程中,确实有利于咱们的开发,咱们想看的时候也是一目了然,点击Application就可以看到。前言大家好,我是林...【详细内容】
2024-03-26  前端之神  微信公众号  Tags:前端   点击:(12)  评论:(0)  加入收藏
前端不存在了?盲测64%的人更喜欢GPT-4V的设计,杨笛一等团队新作
3 月 9 日央视的一档节目上,百度创始人、董事长兼 CEO 李彦宏指出,以后不会存在「程序员」这种职业了,因为只要会说话,人人都会具备程序员的能力。「未来的编程语言只会剩下两种...【详细内容】
2024-03-11  机器之心Pro    Tags:前端   点击:(9)  评论:(0)  加入收藏
前端开始“锈化”?Vue团队开源JS打包工具:基于Rust、速度极快、尤雨溪主导
Vue 团队已正式开源Rolldown —— 基于 Rust 的 JavaScrip 打包工具。Rolldown 是使用 Rust 开发的 Rollup 替代品,它提供与 Rollup 兼容的应用程序接口和插件接口...【详细内容】
2024-03-09  OSC开源社区    Tags:Vue   点击:(11)  评论:(0)  加入收藏
两年前端经验还不会手写Promise?
什么是promise?当我们处理异步操作时,我们经常需要进行一系列的操作,如请求数据、处理数据、渲染UI等。在过去,这些操作通常通过回调函数来处理,但是回调函数嵌套过多会导致代码...【详细内容】
2024-03-07  海燕技术栈  微信公众号  Tags:Promise   点击:(23)  评论:(0)  加入收藏
网站开发中的前端和后端开发有什么区别
前端开发和后端开发都是干什么的?有哪些区别?通俗地讲,前端干的工作是用户可以直接看得见的,而后端开发的工作主要在服务端,用户不太能直接看到。虽然前端开发和后端开发的工作有...【详细内容】
2024-02-21  CarryData    Tags:前端   点击:(32)  评论:(0)  加入收藏
网站程序开发中的前后端分离技术
随着互联网的快速发展和技术的不断创新,传统的网站开发模式已经难以满足日益增长的业务需求。为了提高开发效率、增强系统的可维护性和可扩展性,前后端分离技术逐渐成为了网站...【详细内容】
2024-01-31  网站建设派迪星航    Tags:前后端分离   点击:(23)  评论:(0)  加入收藏
如何优雅的实现前端国际化?
JavaScript 中每个常见问题都有许多成熟的解决方案。当然,国际化 (i18n) 也不例外,有很多成熟的 JavaScript i18n 库可供选择,下面就来分享一些热门的前端国际化库!i18nexti18ne...【详细内容】
2024-01-17  前端充电宝  微信公众号  Tags:前端   点击:(69)  评论:(0)  加入收藏
Vue中Scope是怎么做样式隔离的?
scope样式隔离在 Vue 中,样式隔离是通过 scoped 特性实现的。当在一个组件的 <style> 标签上添加 scoped 特性时,Vue 会自动为这个样式块中的所有选择器添加一个唯一的属性,以...【详细内容】
2024-01-04  海燕技术栈  微信公众号  Tags:Vue   点击:(80)  评论:(0)  加入收藏
vue3中 ref和 reactive的区别 ?
最近有朋友在面试过程中经常被问到这么一个问题,vue3 中的ref 和 reactive的区别在哪里,为什么 要定义两个API 一个 api不能实现 响应式更新吗??带着这个疑问 ,我们 接下来进行逐...【详细内容】
2024-01-03  互联网高级架构师  今日头条  Tags:vue3   点击:(38)  评论:(0)  加入收藏
React18 与 Vue3 全方面对比
1. 编程风格 & 视图风格1.1 编程风格 React 语法少、难度大;Vue 语法多,难度小例如指令:Vue<input v-model="username"/><ul> <li v-for="(item,index) in list" :key="inde...【详细内容】
2024-01-03  爱做梦的程序员  今日头条  Tags:Vue3   点击:(72)  评论:(0)  加入收藏
站内最新
站内热门
站内头条