Логи в Apache

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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