From: Aleksey Filippov Date: Tue, 17 Mar 2026 06:46:45 +0000 (+0300) Subject: fix(ERP-258): агрегация сообщений и дедупликация в TelegramTarget X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=21beb9e85b004ea3895b596701d5d6453d65ff07;p=erp24_rep%2Fyii-erp24%2F.git fix(ERP-258): агрегация сообщений и дедупликация в TelegramTarget - Обработка всех сообщений буфера вместо только первого - Включён shouldSendMessage() для дедупликации (1 раз в день на ошибку) - Лимит 800 символов на сообщение, 4000 итого - disableNotification только если нет ERROR-уровня --- diff --git a/erp24/log/TelegramTarget.php b/erp24/log/TelegramTarget.php index bd4435ea..f6382ac7 100644 --- a/erp24/log/TelegramTarget.php +++ b/erp24/log/TelegramTarget.php @@ -104,40 +104,50 @@ class TelegramTarget extends \yii\log\Target return; } - $message = new Message($this->messages[0]); - $isDev = TelegramService::isDevEnv(); + $serverName = getenv('SERVER_NAME') ?: ""; + $hasError = false; + $parts = []; + + foreach ($this->messages as $rawMessage) { + $message = new Message($rawMessage); + + if ($message->message[1] === Logger::LEVEL_ERROR) { + $hasError = true; + } + + $errorText = $message->getText(); + if (!$this->shouldSendMessage($errorText)) { + continue; + } + + $level = isset($this->levelEmojis[$message->message[1]]) + ? $this->levelEmojis[$message->message[1]] . ' ' + : '*' . ucfirst($message->getLevel()) . '* @ '; + if ($message->getIsConsoleRequest()) { + $level .= '```' . $message->getCommandLine() . '```'; + } else { + $level .= '[' . $message->getUrl() . '](' . $message->getUrl() . ')'; + } + + $parts[] = implode("\n", [ + $level, + " ", + "```" . mb_substr("\n" . $errorText, 0, 800) . "```", + " ", + "```" . $message->getStackTrace() . "```", + "🙂 " . $message->getUserIp() . " " . $serverName, + ]); + } - // Проверка наличия подобных сообщений - /*if (!$this->shouldSendMessage($errorText)) { + if (empty($parts)) { return; - }*/ - - // Формирование уровня и основного сообщения - $level = isset($this->levelEmojis[$message->message[1]]) ? $this->levelEmojis[$message->message[1]] . ' ' : '*' . ucfirst($message->getLevel()) . '* @ '; - if ($message->getIsConsoleRequest()) { - $level .= '```' . $message->getCommandLine() . '```'; - } else { - $level .= '[' . $message->getUrl() . '](' . $message->getUrl() . ')'; } - $serverName = getenv('SERVER_NAME') ? getenv('SERVER_NAME') : ""; - // Текст сообщения - $text = [ - $level, - " ", - "```" . mb_substr( "\n" . $message->getText(), 0, 3300) . "```", - " ", - "```" . $message->getStackTrace() . "```", - "🙂 " . $message->getUserIp() . " " . $serverName, - ]; - - $formattedMessage = implode("\n", $text); + $formattedMessage = mb_substr(implode("\n\n---\n\n", $parts), 0, 4000); $formattedMessage = TelegramService::escapeMarkdown($formattedMessage); - // Настройка уведомления для сообщений уровня ERROR - $disableNotification = $message->message[1] !== Logger::LEVEL_ERROR; + $disableNotification = !$hasError; - // Отправка сообщения через TelegramService try { TelegramService::sendErrorToTelegramMessage($formattedMessage, $disableNotification, $isDev); } catch (\Exception $e) {