npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

pino-connector-core

v0.2.2

Published

Connector core for Pino.

Readme

Pino Connector Core

English | Русский

NPM version NPM downloads Node.js 18+ TypeScript Ready pnpm MIT License

pino-connector-core — это ядро для создания пользовательских решений для логирования с помощью Pino. Он предоставляет переиспользуемый и настраиваемый конвейер логирования, который работает в различных окружениях, таких как фреймворки, фоновые обработчики и интерфейсы командной строки.

pino-connector-core намеренно не зависит от фреймворков. Он не содержит никаких адаптеров для конкретных фреймворков. Вместо этого он предоставляет контракт и набор инструментов, которые позволяют другим пакетам реализовывать коннекторы для конкретных фреймворков (таких как NestJS, Express, Fastify и т.д.) по единым правилам. Такой подход способствует согласованности и переиспользованию в экосистеме.

Какую проблему решает

Вместо того чтобы заново реализовывать транспорты, правила ретуширования и диагностику для каждого нового сервиса, pino-connector-core позволяет один раз настроить конвейер логирования и использовать его везде. Это обеспечивает консистентность и экономит время на разработку.

Ключевые возможности

  • Единый реестр транспортов: Управляйте встроенными и пользовательскими назначениями для логов с безопасными хуками жизненного цикла.
  • Предсказуемая передача контекста: Использует AsyncLocalStorage для надежной обработки контекста в асинхронном коде.
  • Расширяемый конвейер: Используйте плагины "до" и "после" для обогащения записей логов и сериализаторы для ретуширования конфиденциальных данных.
  • Встроенная диагностика: Получайте снимки состояния и производительности транспортов, что идеально подходит для мониторинга и отладки.

Частые сценарии использования

| Сценарий | Преимущество | | ----------------------------------- | ------------------------------------------------------------------------------------------------------------- | | Адаптеры для фреймворков | Экспортируйте чистый API createLogger(), в то время как коннектор управляет сложностью транспортов и хуков. | | Платформы для нескольких команд | Применяйте общие политики обогащения и ретуширования для всех сервисов. | | Внутренние инструменты | Обеспечьте логирование на уровне продакшена для CLI и обработчиков без дублирования кода инфраструктуры. |

Установка

npm install pino-connector-core

Быстрый старт

В следующем примере показано, как создать коннектор, добавить транспорт и записать сообщение с контекстом.

// Импортируем необходимые функции из библиотеки
import { createConnector, stdoutTransport } from "pino-connector-core";

// Создаем новый экземпляр коннектора
const connector = createConnector({
  // Регистрируем встроенный транспорт для вывода в stdout
  transports: [stdoutTransport.registration],
  // Настраиваем начальный контекст и включаем асинхронную передачу
  context: { initial: { service: "api" }, propagateAsync: true },
});

// Создаем экземпляр логгера из коннектора
const logger = connector.createLogger();

// Выполняем функцию с дополнительным контекстом
connector.runWithContext({ requestId: "req-101" }, () => {
  // Этот лог будет включать service и requestId в своем контексте
  logger.info("запрос принят");
});

Диагностические снимки

Вы можете получить снимок состояния коннектора, что полезно для мониторинга.

// Получаем снимок диагностики коннектора
const diagnostics = connector.getDiagnosticsSnapshot();

// Выводим статус транспортов
console.log(diagnostics.transports);

Практические примеры

Обогащение записей с помощью плагина "до"

Плагины могут изменять записи логов перед их отправкой в транспорты.

const connector = createConnector({
  plugins: [
    {
      name: "user-tag",
      stage: "before", // Запускать этот плагин до обработки лога
      hook({ record, setRecord }) {
        // Извлекаем ID пользователя из метаданных лога или используем "anonymous"
        const userId = record.metadata?.data?.user?.id ?? "anonymous";
        // Добавляем userId в контекст лога
        setRecord({ ...record, context: { ...record.context, userId } });
      },
    },
  ],
});

// Этот лог будет обогащен плагином "user-tag"
connector
  .getRootLogger()
  .info({ data: { user: { id: "42" } } }, "пользователь вошел в систему");

Реакция на сбои транспортов с помощью плагина "после"

Плагины "после" могут реагировать на результаты операций транспортов.

const connector = createConnector({
  transports: [stdoutTransport.registration],
  plugins: [
    {
      name: "metrics",
      stage: "after", // Запускать этот плагин после отправки лога в транспорты
      hook({ transportResults }) {
        // Итерируемся по результатам от каждого транспорта
        for (const result of transportResults) {
          if (!result.succeeded) {
            // Если транспорт не сработал, выводим предупреждение
            console.warn("сбой транспорта", result.transportName);
          }
        }
      },
    },
  ],
});

Регистрация пользовательского транспорта

Вы можете легко регистрировать свои собственные транспорты.

// Регистрируем пользовательский транспорт, который отправляет логи на HTTP-эндпоинт
await connector.registerTransport(
  // Указываем имя и конфигурацию для транспорта
  { name: "log-api", config: { endpoint: "https://logs.example.com" } },
  // Фабричная функция создает экземпляр транспорта
  async (registration, { selfLogger }) => ({
    // Метод publish отправляет запись лога в место назначения
    async publish({ record }) {
      await fetch(registration.config.endpoint, {
        method: "POST",
        body: JSON.stringify(record),
        headers: { "content-type": "application/json" },
      });
    },
    // Метод shutdown вызывается при завершении работы коннектора
    async shutdown() {
      selfLogger.info(
        { transport: registration.name },
        "транспорт log-api остановлен",
      );
    },
  }),
);

Документация

Для получения более подробной информации, пожалуйста, обратитесь к документации:

Лицензия

Этот проект лицензирован под лицензией MIT - подробности см. в файле LICENSE.