Автоматический выделенный access_log для каждого клиента, использующего ip в именовании

У нас есть внутреннее приложение, и я хочу, чтобы сервер apache httpd создавал новые файлы журнала на основе каждого ips клиента. В документации я вижу, вы можете иметь несколько журналов.

http://httpd.apache.org/docs/2.2/logs.html

LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
CustomLog logs/referer_log "%{Referer}i -> %U"
CustomLog logs/agent_log "%{User-agent}i"

но то, что я действительно хочу, это что-то вроде этого.

CustomLog logs/%h-access_log common

где%h экстраполируется на IP-адрес, т.е. 1.1.1.1-access_log

Я предполагаю, что есть способ mod_perl сделать это, но просто интересно, знает ли кто-нибудь способ сделать что-то подобное в стандартной конфигурации, прежде чем я напишу модуль.

1 ответ

Решение

Используйте функцию конвейера журналов Apache: журналы можно отправлять стороннему процессу. Этот процесс будет иметь полную свободу действий, чтобы фильтровать вещи по своему усмотрению и создавать файлы по мере необходимости. См. http://httpd.apache.org/docs/2.2/logs.html.

Вам просто нужно написать небольшой скрипт, который анализирует входные данные журнала, чтобы извлечь IP-адрес и переслать строку в соответствующий файл.

В противном случае, если вы каким-то образом управляете количеством клиентов, вы можете заранее определить все необходимые файлы, а затем, используя условное ведение журнала, через конкретные переменные увидеть этот пример по тому же URL-адресу:

# Mark requests from the loop-back interface
SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
# Mark requests for the robots.txt file
SetEnvIf Request_URI "^/robots\.txt$" dontlog
# Log what remains
CustomLog logs/access_log common env=!dontlog 

Но даже с вашим последним комментарием я все же думаю, что постобработка - лучший путь. YMMV.

Другие вопросы по тегам