vsavritsky / monolog-telegram
Monolog handler that sends logs through Telegram bot to any chat in HTML format
Requires
- php: ^7.2
- ext-json: *
- ext-mbstring: *
- monolog/monolog: ^2.0.2
Requires (Dev)
- ext-curl: *
- phpunit/phpunit: ^4.0|^6.0|^8.0
- squizlabs/php_codesniffer: ^3.2
- vlucas/phpdotenv: ^3.3
Suggests
- ext-curl: cURL generally works better and is recommended
README
Send your logs through Telegram bot to any chat and make them look fancy!
Features:
- Continous logging and batch logging support
- Standard stack traces wrapped in
<code></code>
tags - Automatic splitting of the message when it exceeds maximum limit
Prerequisites
- Telegram Bot API token - see here to learn how to obtain one
- ID of the chat to which you want to send the logs - see below
Obtaining chat ID
One of the simplest ways to do that is to interact with the bot in the target chat:
- private and group chats - send any dummy command
- channels - post something in it
After interacting visit https://api.telegram.org/botTOKEN/getUpdates
(replace TOKEN
with your actual bot token), you will be able to find the chat id (chat_id
) in the result JSON.
Installation
Install with Composer:
$ composer require jacklul/monolog-telegram
Usage
To use this handler you just have to add it like every other Monolog handler:
require 'vendor/autoload.php'; $api_token = '123456789:teMbvbETojnSG93jDhnynvH8pT28H9TIB1h'; // Bot API token $chat_id = 987654321; // Target Chat ID $level = Logger::ERROR; // Log level $bubble = true; // Bubble up the stack or not $use_curl = true; // Use cURL or not? (default: use when available) $timeout = 10; // Timeout for API requests $verify_peer = true; // Verify SSL certificate or not? (development/debugging) $logger = new Logger('My project'); $handler = new TelegramHandler($api_token, $chat_id, $level, $bubble, $use_curl, $timeout, $verify_peer); $handler->setFormatter(new TelegramFormatter()); // Usage of this formatter is optional but recommended if you want better message layout $logger->pushHandler($handler); $logger->error('Error!');
To prevent spamming the chat and hitting Telegram's API limits it is advised to use DeduplicationHandler and/or BufferHandler, ideal solution for production use would be:
$handler = new TelegramHandler('TOKEN', 123456789); $handler->setFormatter(new TelegramFormatter()); // Combine all log entries into one and force batch processing $handler = new BufferHandler($handler); // Make sure that particular log stack wasn't sent before $handler = new DeduplicationHandler($handler); // Keep collecting logs until ERROR occurs, after that send collected logs to $handler $handler = new FingersCrossedHandler($handler, new ErrorLevelActivationStrategy(Logger::ERROR)); $logger->pushHandler($handler);
You can customize the formatter:
$html = true; // Choose whether to send the message in HTMl format $format = "<b>%level_name%</b> (%channel%) [%date%]\n\n%message%\n\n%context%%extra%"; // Error (My project) [2018-05-01 15:55:15 UTC] $date_format = 'Y-m-d H:i:s e'; // 2018-05-01 15:55:15 UTC, format must be supported by DateTime::format $separator = '-'; // Seperation character for batch processing - when empty one empty line is used $handler->setFormatter(new TelegramFormatter($html, $format, $date_format, $separator));
License
See LICENSE.