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

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