Логи в 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) дозволяють попередньо (перш ніж чогось у логи записати), щось таке з ними створити, наприклад стиснути. Стандартний значок піпи в юнікс - вертикальна палиця, так що якщо вам закортить логи відразу стискати, робіть так:
Все під юніксом :) Просто тому, що якщо у вас апач на вінді, то логи вести нема чого - навряд чи вона у вас сервером працює %)