Apache слишком длинная строка журнала - PullRequest
4 голосов
/ 01 мая 2020

У меня есть Cloud Foun dry и php приложение с mod-se c.

Приложение получает из браузера json POST. Пост содержит несколько изображений, закодированных в базе 64, и Apace сократил это в несколько строк:

2020-05-01T13:49:31.69+0200 [APP/PROC/WEB/0] OUT 11:49:31 httpd modsec body":["{\"image1\":\"data:image/png;base64, ...
2020-05-01T13:49:31.69+0200 [APP/PROC/WEB/0] OUT tTHNrVze+6IgS/ftH89uE2lw

Есть ли способ объединить эти журналы?

Я могу sh иметь:

2020-05-01T13:49:31.69+0200 [APP/PROC/WEB/0] OUT 11:49:31 httpd modsec body":["{\"image1\":\"data:image/png;base64, ...  tTHNrVze+6IgS/ftH89uE2lw\"}

Ответы [ 3 ]

2 голосов
/ 04 мая 2020

Не думаю, что это проблема с Apache Web Server или mod_se c. Cloud Foun dry будет читать журналы из приложений, запущенных на нем, журналы, которые записываются в STDOUT / STDERR. Именно так вы должны вести журнал, если у вас есть приложение, работающее на Cloud Foun dry, и если вы развертываете приложение PHP на Cloud Foun dry, так как PHP buildpack будет настраивать PHP и Apache веб-сервер для размещения вашего PHP приложения.

Вы не можете просто войти в файл, потому что файловая система для вашего приложения, работающего в Cloud Foun dry, эфемерна. Он будет работать в счастливые времена, но когда что-то не получается и ваше приложение падает, оно не будет работать. Файловая система, включая записанные вами журналы, исчезнет, ​​когда приложение выйдет из строя, и это очень затруднит устранение неполадок.

Что касается поведения, которое вы видите, Cloud Foun dry Система регистрации имеет ограничения по размеру для одной записи журнала. Если вы попытаетесь написать однострочную запись в журнале, выходящую за пределы, система журналов автоматически разделит строку, и вы получите две строки журнала. Я подозреваю, что это то, что здесь происходит.

Я немного посмотрел, но не смог найти документированного максимального значения для длины строки, прежде чем она будет разделена. Лучшее, что я смог найти, было это обсуждение настройки, которое дает некоторую историю об этом . Похоже, он не дает четкого объяснения того, как все устроено.

Поскольку я не мог найти официально задокументированное значение, я хотел проверить и проверить длину. Для этого я развернул тестовое приложение в Pivotal Web Services (работает с последней версией OSS Cloud Foun dry) и написал несколько длинных строк журнала (если вы хотите увидеть тестовый код, просто дайте мне знать). Максимум, который я смог получить до разбиения строки, составил 61441 байт (я повторил символ a в моем тесте, если у вас есть многобайтовые символы, такие как , он разделится раньше). Это соответствовало более старому поведению, упомянутому в обсуждении выше. Возможно, ваш пробег будет отличаться в зависимости от используемой версии CF и конфигурации вашей платформы.

Независимо от точного значения лимита, всегда будет некоторый лимит. Вы можете либо попытаться воссоздать свои записи в журнале, т. Е. Соединить их, после факта, или вы можете сохранить информацию где-нибудь еще. Используйте службу, например базу данных, или отправьте записи журнала непосредственно в syslog.

Syslog - хороший вариант, но встроенная поддержка HTTPD для этого требует, чтобы syslogd работал локально , что не внутри контейнера Cloud Foun dry. Вероятно, проще использовать функцию регистрации по трубопроводам и использовать внешнюю программу для отправки выходов из системы. Вот пример этого .

1 голос
/ 01 мая 2020

Одной из возможностей было бы рассмотрение директивы Apache ErrorLogFormat . Это позволяет упорядочить информацию в каждом журнале Apache, чтобы вы могли создать формат, который бы дал вам более короткую ширину (меньше подробностей), что могло бы помочь на вашем экране.

Я не знаю, как это сделать. объединить журналы в пределах Apache. Он просто слушает команду PHP error_log , поэтому код PHP может связать ее и вызвать error_log только один раз.

1 голос
/ 01 мая 2020

Не полагайтесь на журналы, которые вы нашли напечатанными на терминалах, иногда они хороши, потому что у них есть цвета. Однако лучший и наиболее полный выбор - полагаться на файлы журналов, поскольку они не должны иметь сокращений (надеюсь).

Что касается Apache, то существует два типа apache httpd-сервера. файлы журналов:

  1. Журналы ошибок
  2. Журналы доступа

В зависимости от используемой ОС вы можете найти файл журнала в разных местоположения.

Чтобы найти точное apache местоположение файла журнала, вы можете использовать команду grep :

grep ErrorLog /usr/local/etc/apache22/httpd.conf
grep ErrorLog /etc/apache2/apache2.conf
grep ErrorLog /etc/httpd/conf/httpd.conf

Пример вывода может быть: ErrorLog "/var/log/httpd-error.log".

То же самое для журнала доступа:

grep CustomLog /usr/local/etc/apache22/httpd.conf
grep CustomLog /etc/apache2/apache2.conf
grep CustomLog /etc/httpd/conf/httpd.conf

Другим возможным решением будет печать объекта base-64 непосредственно в файл.

...