Мы получаем сообщение «Допустимая память исчерпана с помощью PHP», когда PHP запрашивает гигабайты памяти. Как отформатировать журнал ошибок Apache, чтобы узнать, к какому URL-адресу он обращался?
Принятый ответ не отвечает на исходный вопрос, поскольку он записывается в access.log, а не в error.log.
вам нужно поместить URL-адрес в переменную среды, а затем вызвать ее из ErrorLogFormat следующим образом:
SetEnvIf Request_URI "(^.*$)" RURI=$1
ErrorLogFormat "%{cu}t %a %l %M URI:%{RURI}e"
взято из файла по умолчанию debian apache2.conf:
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
# If you are behind a reverse proxy, you might want to change %h into %{X-Forwarded-For}i
#
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
Видеть Руководство Apache 2 для значения знаков различного формата% или Директива Apache 2 Manual ErrorlogFormat за наличие журнала ошибок в определенном формате, начиная с Apache 2.4.
коротко :
Определите формат вывода в основном файле конфигурации и файле вывода, например, для каждого виртуального хоста в директиве VirtualHost. Вы также можете определить конфигурационный файл для всех ваших сайтов в основном файле, если хотите.
нужно добавить что-то вроде (если его еще нет):
LogLevel warn
CustomLog /var/log/apache2/access.log combined
ErrorLog /var/log/apache2/error.log
В зависимости от ваших точных настроек вы можете немного изменить местоположение.
Не забывайте регистрировать их, если у вас сайт с высокой посещаемостью.
Обычно это должно быть (по крайней мере, в Debian) настройкой по умолчанию, насколько я помню.
Если у вас есть пустые журналы, вы можете проверить разрешения для папки / файлов, чтобы пользователь, под которым запускается процесс apache2, мог получить доступ и записать в них.
Помните, что перезагрузка процесса (насколько я знаю) необходима для повторного чтения файлов конфигурации.
Это сработало для меня:
ErrorLogFormat "[%t] %{Request_URI}e (Referer: %{Referer}i) [client %a] [%l] %M"
Когда я создал отдельную переменную для URI запроса, как показано @kofifus и @franfran, я получил базовый сценарий, который выполнялся после перезаписи URL-адреса, но мне нужен был путь, видимый пользователем в веб-браузере, и вот что это дает меня.
У меня такая же проблема. Когда вы просматриваете журнал ошибок и хотите узнать, какой URL-адрес вызвал их.
ErrorLogFormat доступен только в Apache 2.4
Токен журнала для настраиваемого журнала и журнала ошибок различны, вы не можете просто использовать токен настраиваемого журнала и поместить его в ErrorLogFormat
Токен ErrorLogFormat: https://httpd.apache.org/docs/2.4/mod/core.html#errorlogformat
Токен CustomLog: https://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats
Возможно, можно использовать переменную и поместить ее в ErrorLogFormat, но для моего собственного тестирования я не мог заставить ее работать.
e.g. SetEnvIf Request_URI "(^.*$)" RURI=$1 SetEnvIf QUERY_STRING "(^.*$)" QSTRING=$1 ErrorLogFormat "%t [URI:%{RURI}e] [QSTRING:%{QSTRING}e] %M"
e.g. LogFormat "[LogID: %L] %t \"%r\" %h" custom-with-id ErrorLogFormat "[LogID: %L] %t %M"
Надеюсь, поможет