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-telegram-logger-transport

v1.7.0

Published

A transport for Pino that forwards structured logs to the Telegram Bot API, supports media attachments, and ships ready-made adapters for NestJS, Fastify, and AWS Lambda

Readme

Pino Telegram transport

Русская версия · English version

Транспорт для Pino, пересылающий структурированные логи в Telegram Bot API с поддержкой медиа и адаптерами NestJS, Fastify и AWS Lambda. Поддерживаются личные чаты, супергруппы, темы и медиа-вложения.

Основные Возможности

  • Отправляй сообщения в несколько чатов и тем с сохранением порядка.
  • Соблюдай лимиты Telegram, управляя задержками и повторами доставки.
  • Ограничивай отправку по порогу уровня через minLevel.
  • Форматируй сообщения встроенным HTML-форматтером или собственным.
  • Отправляй текст, фото или документы в рамках одного транспорта.
  • Переопределяй метод отправки функцией send для тестов или кастомных клиентов.
  • Проверяй токен и генерируй конфигурацию через встроенную CLI.

Требования

  • Node.js 18+
  • Telegram-бот с правами записи в целевые чаты

Установка

npm install pino-telegram-logger-transport

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

import pino from 'pino';

const logger = pino({
  transport: {
    target: 'pino-telegram-logger-transport',
    options: {
      botToken: process.env.TELEGRAM_BOT_TOKEN!,
      chatId: process.env.TELEGRAM_CHAT_ID,
      threadId: process.env.TELEGRAM_THREAD_ID,
      minLevel: 'warn',
      minDelayBetweenMessages: 200,
      retryAttempts: 3,
    },
  },
});

logger.info({ context: { requestId: '42' } }, 'Привет, Telegram!');

Поведение по Умолчанию

Транспорт формирует HTML-сообщение вида:

ℹ️ INFO — <b>Message</b> <b>Time:</b> 2025-09-17T16:35:00.000Z
<b>Context:</b>
<pre>{"requestId":"42"}</pre>

При наличии err добавляется блок Error с полями message и stack. Дополнительные свойства записи (кроме level, time, msg, context, err) попадают в секцию Extras.

Повторы Отправки

  • Повторяй доставку при ответах 429 и 5xx.
  • Настраивай задержки опциями retryAttempts, retryInitialDelay, retryBackoffFactor, retryMaxDelay.
  • Учитывай retry_after, если Telegram вернул рекомендацию по ожиданию.
  • Отключай повторные попытки значением retryAttempts: 1.

Работа с Медиа

logger.warn({
  messageType: 'photo',
  mediaUrl: 'https://example.com/path/to/photo',
  caption: 'Снимок инцидента',
});

По умолчанию форматтер ищет в логе поля messageType (text/photo/document), mediaUrl, mediaBuffer, mediaFilename, mediaContentType и caption. Для двоичных вложений принимает Buffer, Uint8Array, ArrayBuffer или объекты { type: 'Buffer', data: number[] }. Telegram ограничивает подпись медиа 1024 символами — следи за длиной caption.

Кастомизация Заголовков

pino({
  transport: {
    target: 'pino-telegram-logger-transport',
    options: {
      botToken,
      chatId,
      headings: {
        time: 'Время',
        context: 'Контекст',
        error: 'Ошибка',
        extras: 'Дополнительно',
      },
      includeExtras: false,
      extraKeys: ['requestId', 'userId'],
    },
  },
});

Комбинируй headings, includeExtras, extraKeys, contextKeys и maxMessageLength, чтобы адаптировать внешний вид сообщений.

Пользовательский метод отправки send

async function sendToQueue(payload: TelegramSendPayload, method: TelegramMethod) {
  console.log('Method:', method);
  console.log('Payload:', JSON.stringify(payload, null, 2));
}

Опция send получает полезную нагрузку и выбранный метод. Старые обработчики, ожидающие один аргумент, остаются рабочими: второй параметр будет игнорирован.

Интеграция с Фреймворками

NestJS

import { LoggerModule } from 'nestjs-pino';
import { createNestLoggerOptions } from 'pino-telegram-logger-transport';

LoggerModule.forRoot(
  createNestLoggerOptions(
    {
      botToken: process.env.TELEGRAM_BOT_TOKEN!,
      chatId: process.env.TELEGRAM_CHAT_ID!,
    },
    {
      pinoHttp: {
        level: 'info',
      },
    },
  ),
);

Fastify

import fastify from 'fastify';
import { createFastifyLoggerOptions } from 'pino-telegram-logger-transport';

const app = fastify({
  logger: createFastifyLoggerOptions({
    botToken: process.env.TELEGRAM_BOT_TOKEN!,
    chatId: process.env.TELEGRAM_CHAT_ID!,
  }),
});

AWS Lambda

import pino from 'pino';
import { createLambdaLoggerOptions } from 'pino-telegram-logger-transport';

const logger = pino(
  createLambdaLoggerOptions({
    botToken: process.env.TELEGRAM_BOT_TOKEN!,
    chatId: process.env.TELEGRAM_CHAT_ID!,
  }),
);

export const handler = async (event: unknown) => {
  logger.info({ event }, 'Lambda вызвана');
  // бизнес-логика
};

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

Лицензия

MIT