Назад | Перейти на главную страницу

Добавление URL-адреса в журнал ошибок Apache

Мы получаем сообщение «Допустимая память исчерпана с помощью 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-адрес вызвал их.

  1. ErrorLogFormat доступен только в Apache 2.4

  2. Токен журнала для настраиваемого журнала и журнала ошибок различны, вы не можете просто использовать токен настраиваемого журнала и поместить его в 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

  3. Возможно, можно использовать переменную и поместить ее в ErrorLogFormat, но для моего собственного тестирования я не мог заставить ее работать.

    e.g.
    SetEnvIf Request_URI "(^.*$)" RURI=$1
    SetEnvIf QUERY_STRING "(^.*$)" QSTRING=$1
    ErrorLogFormat "%t [URI:%{RURI}e] [QSTRING:%{QSTRING}e] %M"
  1. Наконец, оказывается, что «правильный» способ - использовать токен LogID и ссылаться на него из CustomLog.
    e.g.
    LogFormat "[LogID: %L] %t \"%r\" %h" custom-with-id
    ErrorLogFormat "[LogID: %L] %t %M"

Надеюсь, поможет