Автоматический выделенный 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.