LogTarget - пачка сообщений разбита в 2 вызова?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
victor78
Сообщения: 5
Зарегистрирован: 2018.02.19, 18:11

LogTarget - пачка сообщений разбита в 2 вызова?

Сообщение victor78 »

Пишу Target для логирования, который должен отправлять сообщения-логи в телеграм как телеграм-бот.

При этом данные об ошибке + Stack trace должны отправляться как сообщения, а содержимое массивов GET, POST, FILES и т.д. - в файле.

В целом я всё реализовал, причём файл даже в виде архива.

Я исхожу из того, что первое сообщение в массиве сообщений цели $Target->messages[0][0] - это именно тот текст, который мне нужен в качестве текста, а все остальные ->messages[1..N][0] - содержат массивы GET, POST etc.
(Это работает, но правильно ли я интерпретировал?)

Поэтому в Target->export() я делаю:

Код: Выделить всё

            $main_message = array_shift($this->messages);
            $full_text = $this->formatMessage($main_message);

Потом я собираю текст для файла из остальных сообщений:

Код: Выделить всё

                foreach ($this->messages as $msg){
                    list($text, $level, $category, $timestamp) = $msg;
                    $file_text .= $text." ";
                }
Проделываю всё необходимое, собираю в файл и отправляю.

Это работает всегда почти - есть место в консольном скрипте, где часто отправка файла не работает.
Причём основное сообщение отослано в одно время ( метка 1521243993.3368), а следом за ним идёт второе сообщение вместо ожидаемого файла его текст (GET,POST) и с другой меткой (1521243902.1243). При этом level = LEVEL_INFO.

В самих скриптах - Target и скрипте, который непосредственно шлёт - я навесил try-catch с ручным логом (т.е. пишу ручной нефреймворковский лог в файл на случай, если проблема именно в обработке Таргета). Но проблемы никакой именно в них нет.

:?: :?: :?: :?: :?:
Переформулирую еще раз на всякий случай и уточню:

В определенных обстоятельствах консольный скрипт, работающий со сторонним API, возвращает пустую переменную, а я объявляю throw Exception.

Именно в этом случае имею ситуацию, что $this->messages в Таргете не состоит из текста ошибки + стек вызовов в нулевом элементе, а остальное в следующих $this->messages. Вместо этого Таргет как бы вызывается дважды, оба раза $this->messages состоит только из одного сообщения: текст+стек в первом вызове и глобальные переменные во втором вызове.


:?: :?: :?: :?: :?:

Я искусственно могу создать ситуацию и вместо API отдать null, но в таком случае всё работает как обычно - то есть получается текст + файл. То есть повторить искусственно ошибку не получается.

У меня есть предположение :ugeek: , что это как-то связано с тратой памяти (наверняка логирование освобождает память, если потрачено и так много - допустим, превышен какой-то лимит).
Но выяснить как это работает не очень получается(. В Таргет есть collect, который вызывается через Dispatcher->dispatch($messages, $final).
Как живёт этот диспетчер и откуда он берет messages для меня пока загадка.

:geek:
Может быть кто-то умный подскажет как это всё устроено и в чём может быть загвоздка?
Может есть варианты правильнее как можно реализовать текст+файл и чтобы это было 100%?

Файлы делаю неспроста архивами - они у меня запароленные, считаю это важной частью защиты, ведь глобальные переменные - очень легкий путь к переменным окружения, где могут быть и пароли, и соль и т.п.

Ответить