]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
fix(ERP-258): агрегация сообщений и дедупликация в TelegramTarget origin/feature_filippov_ERP-258_telegram_429_fix
authorAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Tue, 17 Mar 2026 06:46:45 +0000 (09:46 +0300)
committerAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Tue, 17 Mar 2026 06:46:45 +0000 (09:46 +0300)
- Обработка всех сообщений буфера вместо только первого
- Включён shouldSendMessage() для дедупликации (1 раз в день на ошибку)
- Лимит 800 символов на сообщение, 4000 итого
- disableNotification только если нет ERROR-уровня

erp24/log/TelegramTarget.php

index bd4435ea96ee585361551e6324ca7a799949a16d..f6382ac714336aaa3f538e67a2f7828e21ba8220 100644 (file)
@@ -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) {