Кожному з нас хочеться побути «великим братом» і постежити за своїми відвідувачами. Це можна робити по-різному: поставити лічильник, наприклад, HotLog, поставити особливий скрипт, ну а деякі роблять це з допомогою логів Apache. Так-так, ви не помилилися, Apache теж веде логи.

На практиці необхідно зрозуміти значення всього двох директив: LogFormat і CustomLog. Є ще директива ErrorLog, але особисто я використовую лог помилок тільки для перегляду останніх рядків, коли Apache не пускається. Все-таки скажу кілька слів про ErrorLog.

Самі розробники вважають лог помилок сервера, який директивою ErrorLog, і зберігає всі повідомлення про помилки і всю діагностику, найбільш важливим логом. Не вірте їм. Еррор-лог створюється так:

ErrorLog logs/error_log

Практично ніяк не налаштовується, однак є важлива директива LogLevel. Вона дає вказівки сервера писати або не писати в лог помилки різного ступеня тяжкості. Наприклад, директива

LogLevel emerg

Змусить сервер скаржитися тільки на найбільш критичні проблеми, коли сервер не запускається. Параметри за зменшенням: alert, crit, error, warn, notice, info і, звичайно ж, мій коханий

LogLevel debug

При якому вам буде розказано про те, що сервер все-таки відкриває в даний момент файл конфігурації ?

Таким чином, якщо вам потрібні логи помилок, то в httpd.conf слід вказати директиву ErrorLog з параметром «ім’я лода» (шлях вважається відносно ServerRoot) і LogLevel з параметром «ступінь точності». Далі все на вашій совісті ?

Тепер про те, що я вважаю важливим: Combined Logs. Ці логи оповідають про те, хто, коли і навіщо відправляв запити до сервера. Правда, цікаво? Тут ще дві директиви: LogFormat і CustomLog. Покопатися в якому-небудь httpd.conf і ви обов’язково побачите там що-небудь типу

LogFormat «%h %l %u %t «%r» %>s %b» common CustomLog logs/common access_log

Хех, все зрозуміло? Зараз поясню, що це означає. LogFormat приймає два параметри: опис формату лода і назва цього формату. Як бачите, лог, що складається з «%h %l %u %t «%r» %>s %b» називається common. А що означають закарлючки, читайте тут:
%h — IP клієнта. До речі, це запросто може бути і іп його проксі.
%l — це щось незрозуміле, що стосується ідентифікації клієнта за RFC 1413. До речі, апач не намагається її визначити, якщо тільки директива IdentityCheck не встановлена в On
%u — те, що було введено в якості імені користувача HTTP а-авторизації. Те ж саме, що і $HTTP_AUTH_USER ?
%t — час надходження запиту. Коментарів не потребує.
%r — рядок запиту клієнта, наприклад «GET /xxx.gif HTTP/1.1». Зазвичай полягає в лапки, але оскільки лапки — спецсимволи, вони предваряются бэкслэшами — . Таким чином, те, що буде виглядати в балці як рядок в лапках, оформляється так: «%r»
%>s — код відповіді сервера клієнту.
%b — розмір відповіді клієнту. В байтах.
%{Referer} — адресу сторінки, звідки прийшов відвідувач.
%{User-agent} — тип браузера відвідувача. Цей і попередній параметр теж зазвичай вказують в лапках, як і %r

Ці параметри можна комбінувати в будь-якому порядку і в будь-якій кількості. Захочете визначати тільки IP відвідувачів — пишете так:

LogFormat «%h» iponly

Ось і визначено новий формат лода. Загалом, комбінуйте як хочете. Але логи ця директива не створює. Щоб сервер почав писати лог, треба вимагати цього директивою CustomLog, яка приймає два параметри: ім’я файлу лода і його тип. Таким чином, щоб записувати IP клієнтів, треба додати ще й таку строчку:

CustomLog logs/iponly.log iponly

І тільки після цього лог почне нормально вестися. До речі, найпопулярнішим вважається стандарт «combined log», описывающийся так:

LogFormat «%h %l %u %t «%r» %>s %b «%{Referer}i» «%{User-Agent}i»» combined

Як бачите, досить інформативно. А тепер на хвилину уявіть собі, що ваш сервер обробляє близько мільйона запитів в день. І вам охота вести кілька логів. Ну це звичайне явище: скільки скажете раз CustomLog, стільки логів і створиться, а ну як вам захочеться всіх шукачів, які шукають robots.txt писати в окремий лог? Гаразд. Розповідаю.

Є ще така корисна директива SetEnvIf (або SetEnvIfNoCase — те ж саме, але без урахування великих/маленьких літер), вона дозволяє в залежності від умови визначати змінні середовища. Наприклад:

SetEnvIf Request_URI «^robots.txt$» crawler

Після цього змінна env буде дорівнювати «crawler». Але це ще не все! В залежності від значення цієї змінної ви можете робити запис в різні логи! Ось так:

CustomLog logs/crawlers combined env=crawler CustomLog logs/clients combined env=!crawler

Ось так, нашому апачу палець в рот не клади ? Не буду розповідати чому robots.txt так дивно написано, називається це регулярні вирази, а почитати про них можна або в підручнику, або в сторінці мануала перла по імені perlre. Ось так: man perlre. Під юнікс, звичайно ?

Уфф… Все, начебто? Ні, є ще піпи. Піпи (pipes) дозволяють попередньо (перш ніж чогось в логи записати), що-небудь таке з ними створити, наприклад стиснути. Стандартний значок піпи в юниксе — вертикальна палиця, так що якщо вам закортить логи відразу стискати, робіть так:

CustomLog «|/usr/bin/gzip -c >> /var/log/access_log.gz» common

Все під юнікс ? Просто тому, що якщо у вас апач на вінді, то логи вести нема чого — навряд чи вона у вас сервер працює %)

P. S. Більша частина цього матеріалу — вільний переклад відповідних статей з Apache Manual. Він лежить тут: http://httpd.apache.org.

P. P. S. Щастя вам і радості!

P. P. P. S. Ах, так… зручно, якщо треба щось перевірити в роботі сервера, стежити за логом в «реальному часі», ось так:

$ tail -f /etc/httpd/logs/logfile