Модуль Apache mod_log_config
| Описание: | Регистрация запросов, поступающих на сервер |
|---|---|
| Статус: | Базовый |
| Идентификатор модуля: | log_config_module |
| Исходный файл: | mod_log_config.c |
Краткое описание
Этот модуль обеспечивает гибкую регистрацию запросов клиентов. Журналы записываются в настраиваемом формате и могут сохраняться непосредственно в файл или передаваться внешней программе. Предусмотрена условная регистрация, позволяющая включать отдельные запросы в журналы или исключать их на основании характеристик запроса.
Модуль предоставляет три директивы: TransferLog для создания файла журнала, LogFormat для задания пользовательского формата и CustomLog для определения файла журнала и формата за один шаг. Директивы TransferLog и CustomLog можно использовать несколько раз в каждом сервере, чтобы регистрировать каждый запрос в нескольких файлах.
Пользовательские форматы журналов
Аргумент format директив LogFormat и CustomLog — это строка. Эта строка используется для регистрации каждого запроса в файле журнала. Она может содержать символы, буквально копируемые в файлы журналов, а также управляющие символы в стиле C "\n" и "\t", обозначающие символы новой строки и табуляции. Кавычки и обратные косые черты следует экранировать обратными косыми чертами.
Характеристики самого запроса регистрируются с помощью директив "%" в строке формата, которые заменяются в файле журнала следующими значениями:
| Строка формата | Описание | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
%% | Знак процента. | ||||||||||
%a | IP-адрес клиента, отправившего запрос (см. модуль mod_remoteip). |
||||||||||
%{c}a | IP-адрес базового узла-пира соединения (см. модуль mod_remoteip). |
||||||||||
%A | Локальный IP-адрес. | ||||||||||
%B | Размер ответа в байтах без заголовков HTTP. | ||||||||||
%b | Размер ответа в байтах без заголовков HTTP. В формате CLF, то есть, выводится '-', а не 0, если байты не отправлены. |
||||||||||
%{VARNAME}C | Содержимое cookie VARNAME в запросе, отправленном серверу. Полностью поддерживаются только cookie версии 0. | ||||||||||
%D | Время обработки запроса в микросекундах. | ||||||||||
%{VARNAME}e | Содержимое переменной среды VARNAME. | ||||||||||
%f | Имя файла. | ||||||||||
%h | Удалённое имя хоста. Будет записан IP-адрес, если HostnameLookups установлена в Off, что является значением по умолчанию. Если имя хоста записывается только для нескольких узлов, вероятно, у вас есть директивы управления доступом, в которых они указаны по именам. См. документацию по Require host. |
||||||||||
%{c}h | Аналогично %h, но всегда выводит имя хоста базового TCP-соединения, а не имя, изменённое такими модулями, как mod_remoteip. |
||||||||||
%H | Протокол запроса. | ||||||||||
%{VARNAME}i | Содержимое строк заголовка VARNAME: в запросе, отправленном серверу. На него влияют изменения, внесённые другими модулями (например, mod_headers). Если вам нужно узнать, каким был заголовок запроса до его изменения большинством модулей, используйте mod_setenvif, чтобы скопировать заголовок во внутреннюю переменную среды, а затем зарегистрируйте это значение с помощью описанного выше %{VARNAME}e. |
||||||||||
%k | Количество запросов keepalive, обработанных в этом соединении. Имеет смысл, если используется KeepAlive: например, «1» означает первый запрос keepalive после исходного, «2» — второй и т. д.; в противном случае всегда равно 0 (указывает на исходный запрос). |
||||||||||
%l | Имя удалённого пользователя в журнале (из identd, если предоставлено). Возвращает дефис, если отсутствует mod_ident или IdentityCheck не установлена в On. |
||||||||||
%L | Идентификатор запроса в журнале ошибок (или «-», если для этого запроса ничего не было записано в журнал ошибок). Найдите соответствующую строку в журнале ошибок, чтобы узнать, какой запрос вызвал ту или иную ошибку. | ||||||||||
%m | Метод запроса. | ||||||||||
%{VARNAME}n | Содержимое заметки VARNAME из другого модуля. | ||||||||||
%{VARNAME}o | Содержимое строк заголовка VARNAME: в ответе. |
||||||||||
%p | Канонический порт сервера, обработавшего запрос. | ||||||||||
%{format}p | Канонический порт сервера, обработавшего запрос, фактический порт сервера или фактический порт клиента. Допустимые форматы: canonical, local или remote. |
||||||||||
%P | Идентификатор процесса дочернего процесса, обработавшего запрос. | ||||||||||
%{format}P | Идентификатор процесса или потока дочернего процесса, обработавшего запрос. Допустимые форматы: pid, tid и hextid. |
||||||||||
%q | Строка запроса (перед ней добавляется ?, если строка запроса существует; в противном случае выводится пустая строка). |
||||||||||
%r | Первая строка запроса. | ||||||||||
%R | Обработчик, сформировавший ответ (если есть). | ||||||||||
%s | Код состояния. Для запросов, перенаправленных внутри сервера, это код состояния исходного запроса. Используйте %>s для конечного кода состояния. |
||||||||||
%t | Время получения запроса в формате [18/Sep/2011:19:18:28 -0400]. Последнее число указывает смещение часового пояса относительно GMT. |
||||||||||
%{format}t | Время в формате, заданном аргументом format, который должен соответствовать расширенному формату strftime(3) (потенциально локализованному). Если формат начинается с begin: (по умолчанию), время берётся в начале обработки запроса. Если он начинается с end:, время берётся при записи записи журнала, ближе к концу обработки запроса. Помимо форматов, поддерживаемых strftime(3), поддерживаются следующие маркеры формата:
strftime(3) в одной строке формата. Вместо этого можно использовать несколько маркеров %{format}t. |
||||||||||
%T | Время обработки запроса в секундах. | ||||||||||
%{UNIT}T | Время обработки запроса в единицах времени, заданных с помощью UNIT. Допустимые единицы: ms для миллисекунд, us для микросекунд и s для секунд. Использование s даёт тот же результат, что и %T без формата; использование us даёт тот же результат, что и %D. Комбинация %T с единицей измерения доступна в версии 2.4.13 и более поздних. |
||||||||||
%u | Удалённый пользователь, если запрос прошёл аутентификацию. Значение может быть недостоверным, если код состояния ответа (%s) равен 401 (не авторизован). |
||||||||||
%U | Запрошенный путь URL без строки запроса. | ||||||||||
%v | Канонический ServerName сервера, обработавшего запрос. |
||||||||||
%V | Имя сервера согласно параметру UseCanonicalName. |
||||||||||
%X | Состояние соединения после завершения ответа:
|
||||||||||
%I | Полученные байты, включая запрос и заголовки. Значение не может быть нулевым. Для использования этой директивы необходимо включить mod_logio. |
||||||||||
%O | Отправленные байты, включая заголовки. В редких случаях значение может быть нулевым, например если запрос прерван до отправки ответа. Для использования этой директивы необходимо включить mod_logio. |
||||||||||
%S | Переданные байты (полученные и отправленные), включая запрос и заголовки; значение не может быть нулевым. Это сумма %I и %O. Для использования этой директивы необходимо включить mod_logio. |
||||||||||
%{VARNAME}^ti | Содержимое строк трейлера VARNAME: в запросе, отправленном серверу. |
||||||||||
%{VARNAME}^to | Содержимое строк трейлера VARNAME: в ответе, отправленном сервером. |
Модификаторы
Чтобы выводить отдельные элементы только для ответов с определёнными кодами состояния HTTP, сразу после знака "%" укажите список кодов состояния, разделённых запятыми. Перед списком кодов состояния можно поставить "!", чтобы указать отрицание.
| Строка формата | Значение |
|---|---|
%400,501{User-agent}i | Записывает User-agent только при ошибках 400 и 501. Для остальных кодов состояния будет записана строка "-". |
%!200,304,302{Referer}i | Записывает Referer для всех запросов, которые не возвращают один из трёх указанных кодов; в противном случае записывается "-". |
Для запросов, перенаправленных внутри сервера, можно использовать модификаторы "<" и ">", чтобы выбрать, следует ли проверять исходный или конечный запрос соответственно. По умолчанию директивы % %s, %U, %T, %D, и %r проверяют исходный запрос, а все остальные — конечный. Например, %>s можно использовать для записи конечного кода состояния запроса, а %<u — для записи исходного аутентифицированного пользователя в запросе, перенаправленном внутри сервера на ресурс без аутентификации.
Примечания к форматам
Из соображений безопасности, начиная с версии 2.0.46, непечатаемые и другие специальные символы в %r, %i и %o экранируются последовательностями \xhh, где hh обозначает шестнадцатеричное представление исходного байта. Исключения из этого правила — " и \, перед которыми ставится обратная косая черта, а также все пробельные символы, записываемые в нотации C (\n, \t и т. д.). В версиях до 2.0.46 эти строки не экранировались, поэтому при работе с необработанными файлами журналов следовало соблюдать осторожность.
Начиная с httpd 2.0, в отличие от версии 1.3, строки формата %b и %B обозначают не количество байтов, отправленных клиенту, а просто размер ответа HTTP в байтах (который будет отличаться, например, если соединение прервано или используется SSL). Формат %O, предоставляемый директивой mod_logio, записывает фактическое количество байтов, отправленных по сети.
Примечание: mod_cache реализован как быстрый обработчик, а не как стандартный обработчик. Поэтому строка формата %R не будет возвращать сведения об обработчике при использовании кэширования содержимого.
Примеры
Ниже приведены некоторые часто используемые строки форматов журналов:
- Общий формат журнала (CLF)
"%h %l %u %t \"%r\" %>s %b"- Общий формат журнала с виртуальным хостом
"%v %h %l %u %t \"%r\" %>s %b"- Расширенный/объединённый формат журнала NCSA
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""- Формат журнала Referer
"%{Referer}i -> %U"- Формат журнала Agent (браузер)
"%{User-agent}i"
Директиву %{format}t можно использовать несколько раз, чтобы составить формат времени с расширенными маркерами формата, например msec_frac:
- Метка времени с миллисекундами
"%{%d/%b/%Y %T}t.%{msec_frac}t %{%z}t"
Вопросы безопасности
Подробнее о том, почему безопасность системы может быть нарушена, если каталог с файлами журналов доступен для записи кому-либо, кроме пользователя, запускающего сервер, см. в документе советы по безопасности.
Директива BufferedLogs
| Описание: | Буферизация записей журнала в памяти перед записью на диск |
|---|---|
| Синтаксис: | BufferedLogs On|Off |
| По умолчанию: | BufferedLogs Off |
| Контекст: | конфигурация сервера |
| Статус: | Базовый |
| Модуль: | mod_log_config |
Директива BufferedLogs заставляет mod_log_config хранить несколько записей журнала в памяти и записывать их на диск вместе, а не после каждого запроса. В некоторых системах это может повысить эффективность доступа к диску и, следовательно, производительность. Её можно задать только один раз для всего сервера; настроить её для отдельного виртуального хоста нельзя.
Директива CustomLog
| Описание: | Задаёт имя файла и формат файла журнала |
|---|---|
| Синтаксис: | CustomLog file|pipe format|nickname [env=[!]environment-variable| expr=expression] |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Базовый |
| Модуль: | mod_log_config |
Директива CustomLog используется для регистрации запросов к серверу. Задаётся формат журнала; при необходимости регистрацию можно выполнять условно, используя переменные среды и характеристики запроса.
Первый аргумент, задающий расположение для записи журналов, может принимать значения одного из двух типов:
- file
- Имя файла относительно
ServerRoot. - pipe
- Символ канала "
|", за которым следует путь к программе, получающей данные журнала через стандартный ввод. Дополнительные сведения см. в примечаниях о журналах, передаваемых через канал.Безопасность:
Если используется программа, она будет запущена от имени пользователя, запустившего
httpd. Если сервер запущен от имени root, программа будет запущена от имени root; убедитесь, что она безопасна.Примечание
При указании пути к файлу на платформах, отличных от Unix, используйте только прямые косые черты, даже если платформа допускает обратные косые черты. В целом рекомендуется всегда использовать прямые косые черты во всех файлах конфигурации.
Второй аргумент задаёт содержимое файла журнала. В качестве него можно указать псевдоним, определённый предыдущей директивой LogFormat, или явную строку формата, описанную в разделе форматы журналов.
Например, следующие два набора директив имеют совершенно одинаковый эффект:
# CustomLog with format nickname LogFormat "%h %l %u %t \"%r\" %>s %b" common CustomLog "logs/access_log" common # CustomLog with explicit format string CustomLog "logs/access_log" "%h %l %u %t \"%r\" %>s %b"
Третий аргумент является необязательным и определяет, следует ли регистрировать конкретный запрос. Условием может быть наличие или отсутствие (в случае предложения 'env=!name') определённой переменной в среде сервера. Кроме того, условие можно задать как произвольное логическое выражение. Если условие не выполнено, запрос регистрироваться не будет. Ссылки на заголовки HTTP в выражении не приведут к добавлению имён заголовков в заголовок Vary.
Переменные среды можно устанавливать отдельно для каждого запроса с помощью модулей mod_setenvif и/или mod_rewrite. Например, если нужно записывать запросы ко всем GIF-изображениям на сервере в отдельный файл журнала, но не в основной журнал, можно использовать:
SetEnvIf Request_URI \.gif$ gif-image CustomLog "gif-requests.log" common env=gif-image CustomLog "nongif-requests.log" common env=!gif-image
Или, чтобы воспроизвести поведение старой директивы RefererIgnore, можно использовать следующее:
SetEnvIf Referer example\.com localreferer CustomLog "referer.log" referer env=!localreferer
Директива GlobalLog
| Описание: | Задаёт имя файла и формат файла журнала |
|---|---|
| Синтаксис: | GlobalLogfile|pipe format|nickname [env=[!]environment-variable| expr=expression] |
| Контекст: | конфигурация сервера |
| Статус: | Базовый |
| Модуль: | mod_log_config |
| Совместимость: | Доступна в Apache HTTP Server 2.4.19 и более поздних версиях |
Директива GlobalLog определяет журнал, общий для конфигурации основного сервера и всех заданных виртуальных хостов.
Директива GlobalLog идентична директиве CustomLog, за исключением следующих отличий:
-
GlobalLogнедопустима в контексте виртуального хоста. -
GlobalLogиспользуется виртуальными хостами, которые определяют собственнуюCustomLog, в отличие от глобально заданнойCustomLog.
Директива LogFormat
| Описание: | Задаёт формат для использования в файле журнала |
|---|---|
| Синтаксис: | LogFormat format|nickname [nickname] |
| По умолчанию: | LogFormat "%h %l %u %t \"%r\" %>s %b" |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Базовый |
| Модуль: | mod_log_config |
Эта директива задаёт формат файла журнала доступа.
Директива LogFormat может использоваться в одной из двух форм. В первой форме, когда указан только один аргумент, эта директива задаёт формат журнала, который будет использоваться в последующих директивах TransferLog. Единственный аргумент может задавать явный формат, как описано выше в разделе пользовательские форматы журналов. Также можно указать псевдоним, ссылающийся на формат журнала, определённый предыдущей директивой LogFormat, как описано ниже.
Вторая форма директивы LogFormat связывает явный формат с псевдонимом. Затем этот псевдоним можно использовать в последующих директивах LogFormat или CustomLog вместо повторения всей строки формата. Директива LogFormat, задающая псевдоним, не делает ничего другого — она только задаёт псевдоним, но не применяет формат и не делает его форматом по умолчанию. Поэтому она не влияет на последующие директивы TransferLog. Кроме того, директива LogFormat не может использовать один псевдоним для определения другого. Обратите внимание: псевдоним не должен содержать знаков процента (%).
Пример
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
Директива TransferLog
| Описание: | Задаёт расположение файла журнала |
|---|---|
| Синтаксис: | TransferLog file|pipe |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Базовый |
| Модуль: | mod_log_config |
Эта директива имеет те же аргументы и действует так же, как директива CustomLog, за исключением того, что она не позволяет явно задавать формат журнала или условно регистрировать запросы. Вместо этого формат журнала определяется последней указанной директивой LogFormat, которая не задаёт псевдоним. Если другой формат не задан, используется общий формат журнала.
Пример
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
TransferLog logs/access_log
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_log_config.html