Инструкции LogFormat определяют формат записей файла журнала. Инструкция LogFormat содержит два элемента: формат записи файла и метку, используемую внутри файла httpd.conf для указания на такую запись. Формат записи заключен в двойные кавычки и непосредственно следует за ключевым словом LogFormat. Формат состоит из постоянных подстрок (литералов) и переменных.
Чтобы понять, как используются переменные, обратимся к примеру инструкции LogFormat. Базовый файл журнала Apache подчиняется формату CLF (Common Log Format). CLF - это стандарт, используемый всеми разработчиками веб-серверов. Таким образом, журналы, созданные серверами Apache, могут обрабатываться любыми инструментами анализа журналов, понимающими стандарт CLF. Формат стандартной записи CLF четко определен второй инструкцией LogFormat из файла httpd.conf Solaris: Данная инструкция LogFormat указывает только те сведения, которые требуются для записи журнала CLF. С этой целью используется набор из семи переменных LogFormat:
%h
Регистрирует IP-адрес клиента. При включенном параметре HostnameLookups регистрируется абсолютное имя узла клиента. Для нашей системы Solaris это будет IP-адрес клиента, поскольку HostnameLookups заблокированы с целью повышения производительности сервера.
%l
Регистрирует имя, под которым зарегистрировался клиент, если таковое доступно. Имя извлекается по протоколу identd; однако большинство клиентов не используют identd и не предоставляют сведения такого рода. Как следствие, данное поле обычно содержит дефис, обозначающий отсутствие значения. Точно так же, если сервер не способен определить значение для поля, журнал содержит дефис в этом поле.
%u
Регистрирует имя пользователя, использованное для доступа к веб-странице, защищенной паролем. Имя должно совпадать с именем, определенным в файле сервера AuthUser или базе данных AuthDBMUser. (AuthUser и AuthDBMUser рассмотрены в разделе «Безопасность веб-сервера» далее в этой главе.) Парольная защита используется не так уж часто, и данное поле в большинстве записей журнала содержит дефис.
%t
Регистрирует дату и время создания записи журнала.
%r
Регистрирует первую строку запроса клиента. Часто она содержит URL- идентификатор запрошенного документа. Символы \" в инструкции LogFormat показывают, что вывод должен содержать символ двойной кавычки. В результате в файле журнала запрос клиента будет заключен в двойные кавычки.
%>s
Регистрирует состояние последнего запроса. Состояние - это код ответ сервера клиенту, состоящий из трех цифр.
%b
Фиксирует число байтов в документе, который был отправлен клиенту.
Записи журнала Apache не ограничены форматом CLF. Инструкция LogFormat позволяет указать, какую информацию следует фиксировать в журнале. Диапазон таких сведений достаточно широк.
Файл httpd.conf Solaris содержит три дополнительных инструкции LogFormat, демонстрирующих варианты форматов журнальных записей. Вот эти инструкции:
LogFormat "%{User-agent}i" agent LogFormat "%{Referer}i -> %U" referer LogFormat "%h %1 %u %t \"*r\" %>s *b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Все эти инструкции регистрируют содержимое HTTP-заголовков. Так, первая инструкция регистрирует значение, полученное от клиента в заголовке User-agent. User-agent - это программа пользователя, генерирующая запрос на документ; как правило, речь идет о названии броузера. Строка формата, позволяющая зафиксировать в журнале содержимое такого заголовка:
%{User-agent}i
Данный формат работает для всех заголовков: достаточно заменить Useragent другим названием (заголовка). Буква i указывает, что речь идет о полученном заголовке (input header); отправленные заголовки (output headers) фиксируются по букве о. Сервер Apache способен регистрировать содержимое любых заголовков, полученных или отправленных.
Вторая инструкция LogFormat фиксирует содержимое заголовка Referer , полученного от клиента (%{Referer}i), символы дефиса и знака «больше» (->), а также URL-адрес, на который поступил запрос (%U). Referer - это имя внешнего сайта, который перенаправил клиента на ваш веб-сайт; %U - документ, к которому этот сайт направил клиента.
Последняя инструкция LogFormat начинается с переменных CLF (%h %1 %u %t \"%г\" %>s %b \") и дополнительно содержит значения из заголовков Referer и User-agent. Данному формату присвоена метка combined, поскольку он сочетает CLF с прочими сведениями; два предшествующих формата разумно отмечены как agent и referer. Однако ни один из этих форматов наделе не используется в настройках Solaris. Наличия инструкции LogFormat недостаточно для создания файла журнала: следует добавить соответствующую инструкцию CustomLog, которая свяжет формат с файлом. Как это сделать, будет рассказано ниже.
В инструкции LogFormat спецификация формата записи журнала заключается в двойные кавычки. Метка, следующая за спецификацией, не является частью формата. В инструкции LogFormat, определяющей формат CLF, метка common - это произвольная строка, связывающая данную инструкцию LogFormat с определенной инструкцией CustomLog. В файле httpd.conf Solaris данная конкретная инструкция LogFormat связывается с файлом /var/apache/logs/access_log при помощи следующей строки:
CustomLog /var/apache/logs/access_log common
Две инструкции связываются благодаря общей метке - common. В результате записи CLF, определенные данной конкретной инструкцией LogFormat , записываются в файл, определенный в указанной инструкции CustomLog.
В настройках Solaris прочие инструкции CustomLog (создающие файлы журналов для записей agent, referer и combined) закомментированы:
#CustomLog /var/apache/logs/referer_log referer #CustomLog /var/apache/logs/agent_log agent #CustomLog /var/apache/logs/access_log combined
Файл referer log хранит URL-адреса страниц, с которых произошел переход на ваш веб-сервер. Это позволяет определить, какие сайты указывают на ваши веб-страницы. Записи в referer_ log имеют следующий формат:
LogFormat "%{Referer}i -> %U" referer
Чтобы создать журнал, раскомментируйте следующую строку:
CustomLog /var/apache/logs/referer_log referer
Файл agent_log фиксирует, какие броузеры используются для доступа к ва- шему сайту, и формат его записей определяется следующим оператором LogFormat:
LogFormat "%{User-agent}i" agent
Чтобы создать журнал, раскомментируйте следующую строку:
CustomLog /var/apache/logs/agent_log agent
Наконец, формат расширенного CLF-журнала определен строкой:
LogFormat "%h %1 %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Чтобы создать комбинированный журнал, раскомментируйте следующую строку:
CustomLog /var/apache/logs/access_log combined
и закомментируйте эту:
#CustomLog /var/apache/logs/access_log commo n
В результате этих изменений для создания файла журнала /var/apache/ logs/access_log будет использоваться формат combined. Именно для этого файла журнала по умолчанию используется формат common. Чтобы избежать дублирования записей, выключите регистрацию common, если включили регистрацию combined. По существу, эти изменения переключают формат файла access_log с common на combined.
Оператор LogFormat и соответствующий ему оператор CustomLog заканчиваются одной и той же меткой. Метка - это произвольное имя, связывающее формат и файл журнала.