Как отправить сообщение об ошибке в Graylog из приложения Symfony внутри кластера Kubernetes ⇐ Php
Как отправить сообщение об ошибке в Graylog из приложения Symfony внутри кластера Kubernetes
Пара докер-контейнеров, работающих внутри кластера Kubernetes:
PHP Нгинкс MySQL Редис Существует экземпляр Graylog (версия 3), который прослушивает stdout и stderr из этих контейнеров.
В PHP-контейнере находится приложение Symfony, которое использует Monolog для регистрации ошибок, информации, предупреждений, уведомлений и многого другого. Monolog обычно регистрируется в файле, определенном в /config/packages/prod/monolog.yaml, например:
монолог: обработчики: основной: тип: скрещенные пальцы уровень_действия: ошибка обработчик: вложенный исключенные_http_codes: [404, 405] вложенный: тип: вращающийся_файл путь: "%kernel.logs_dir%/%kernel.environment%.log" # info('Это информационный журнал'); return new Response('Проверьте логи!'); } } для записи журналов в stdout или stderr. Но в стандартный вывод ничего не выводится.
Мои (лучшие) попытки:
Консоль
: тип: консоль process_psr_3_messages: ложь каналы: ['!event', '!doctrine', '!console'] syslog_handler: тип: системный журнал уровень: отладка Попытка решения 2: просто используйте error_log() Функция error_log('my message') выполняет вывод на консоль. Ура! Однако мне кажется глупым, что у меня есть такая огромная библиотека журналов (Monolog), хотя в конце концов я все равно просто использую error_log().
Кроме того, я бы хотел, чтобы все ошибки и предупреждения перехватывали и отправлялись в Graylog, а не только мои собственные вставленные операторы error_log.
Другая часть этого заключается в том, что это пример моего вывода, когда я использую error_log():
имя_проекта-php-1 | ВНИМАНИЕ. Сообщение PHP: ZZZ ErrorLogStatement: Error.log(). имя проекта-nginx-1 | 2023/09/22 12:56:17 [ошибка] 10#10: *20 FastCGI отправлено в stderr: «Сообщение PHP: ZZZ ErrorLogStatement: Error.log()» при чтении заголовка ответа из восходящего потока, клиент: 172.20.0.1, сервер: symfony.local, запрос: «GET /my-custom-endpoint?test_case=all_logs HTTP/1.1», восходящий поток: «fastcgi://172.20.0.5:9000», хост: «127.0.0.1:8200» имя проекта-nginx-1 | 172.20.0.1 - - [22/сен/2023:12:56:17 +0000] "GET /my-custom-endpoint?test_case=all_logs HTTP/1.1" 200 35 "-" "PostmanRuntime/7.32.3" "- " имя проекта-php-1 | 172.20.0.6 — 22 сентября 2023 г.:12:56:02 +0000 «GET /index.php» 200 Это означает, что и мой Nginx-контейнер, и мой PHP-контейнер выдают ошибку, которая добавляет много избыточных строк в мой Graylog. Я могу фильтровать это, но все же! Это грязно.
Попытка решения 3: «Связать» мой журнал ошибок с stdout
Я нашел это предложение здесь: заставить приложение Docker писать в стандартный вывод.
Это значит «связать» вращающийся файл журнала ошибок с stdout (а затем, возможно, удалить ротацию этого файла).
Итак, я попытался запустить это:
ln -sf /dev/stdout /var/www/docroot/var/log/my-log-file.log Но я столкнулся с этой ошибкой:
Поток или файл: «/var/www/docroot/var/log/prod-2023-09-22.log» не удалось открыть в режиме добавления: не удалось открыть поток: такого файла или каталога нет.< /п> И даже если бы это сработало... Это кажется хакерским и неправильным подходом. Поэтому я перестал пытаться заставить это работать.
Попытка решения 4. Отправка ошибок из Monolog в Graylog через его API
Это было бы идеальное решение. Я просто надеялся на более простое решение.
Но это то, чем я сейчас занимаюсь.
Пара докер-контейнеров, работающих внутри кластера Kubernetes:
PHP Нгинкс MySQL Редис Существует экземпляр Graylog (версия 3), который прослушивает stdout и stderr из этих контейнеров.
В PHP-контейнере находится приложение Symfony, которое использует Monolog для регистрации ошибок, информации, предупреждений, уведомлений и многого другого. Monolog обычно регистрируется в файле, определенном в /config/packages/prod/monolog.yaml, например:
монолог: обработчики: основной: тип: скрещенные пальцы уровень_действия: ошибка обработчик: вложенный исключенные_http_codes: [404, 405] вложенный: тип: вращающийся_файл путь: "%kernel.logs_dir%/%kernel.environment%.log" # info('Это информационный журнал'); return new Response('Проверьте логи!'); } } для записи журналов в stdout или stderr. Но в стандартный вывод ничего не выводится.
Мои (лучшие) попытки:
Консоль
: тип: консоль process_psr_3_messages: ложь каналы: ['!event', '!doctrine', '!console'] syslog_handler: тип: системный журнал уровень: отладка Попытка решения 2: просто используйте error_log() Функция error_log('my message') выполняет вывод на консоль. Ура! Однако мне кажется глупым, что у меня есть такая огромная библиотека журналов (Monolog), хотя в конце концов я все равно просто использую error_log().
Кроме того, я бы хотел, чтобы все ошибки и предупреждения перехватывали и отправлялись в Graylog, а не только мои собственные вставленные операторы error_log.
Другая часть этого заключается в том, что это пример моего вывода, когда я использую error_log():
имя_проекта-php-1 | ВНИМАНИЕ. Сообщение PHP: ZZZ ErrorLogStatement: Error.log(). имя проекта-nginx-1 | 2023/09/22 12:56:17 [ошибка] 10#10: *20 FastCGI отправлено в stderr: «Сообщение PHP: ZZZ ErrorLogStatement: Error.log()» при чтении заголовка ответа из восходящего потока, клиент: 172.20.0.1, сервер: symfony.local, запрос: «GET /my-custom-endpoint?test_case=all_logs HTTP/1.1», восходящий поток: «fastcgi://172.20.0.5:9000», хост: «127.0.0.1:8200» имя проекта-nginx-1 | 172.20.0.1 - - [22/сен/2023:12:56:17 +0000] "GET /my-custom-endpoint?test_case=all_logs HTTP/1.1" 200 35 "-" "PostmanRuntime/7.32.3" "- " имя проекта-php-1 | 172.20.0.6 — 22 сентября 2023 г.:12:56:02 +0000 «GET /index.php» 200 Это означает, что и мой Nginx-контейнер, и мой PHP-контейнер выдают ошибку, которая добавляет много избыточных строк в мой Graylog. Я могу фильтровать это, но все же! Это грязно.
Попытка решения 3: «Связать» мой журнал ошибок с stdout
Я нашел это предложение здесь: заставить приложение Docker писать в стандартный вывод.
Это значит «связать» вращающийся файл журнала ошибок с stdout (а затем, возможно, удалить ротацию этого файла).
Итак, я попытался запустить это:
ln -sf /dev/stdout /var/www/docroot/var/log/my-log-file.log Но я столкнулся с этой ошибкой:
Поток или файл: «/var/www/docroot/var/log/prod-2023-09-22.log» не удалось открыть в режиме добавления: не удалось открыть поток: такого файла или каталога нет.< /п> И даже если бы это сработало... Это кажется хакерским и неправильным подходом. Поэтому я перестал пытаться заставить это работать.
Попытка решения 4. Отправка ошибок из Monolog в Graylog через его API
Это было бы идеальное решение. Я просто надеялся на более простое решение.
Но это то, чем я сейчас занимаюсь.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение