Cronolog и логирование виртуальных хостов
Итак, я годами использовал cronolog с этой директивой:
<VirtualHost *:80>
SetEnv origin SND
ServerName sandman.net
CustomLog "|/usr/bin/cronolog [..]/logs/SND/log_%Y-%m.txt" combined
</VirtualHost>
Проблема в том, что с большим количеством виртуальных хостов я неожиданно достигаю своего максимального количества дескрипторов открытых файлов, когда apache порождает хронолога.
С некоторым поиском (и поиском здесь) я не нашел решения для этого, так что нет? Как вы можете видеть, я установил переменную ENV в Apache на "SND" для этого vhost, и мне хотелось бы сделать что-то вроде этого:
CustomLog "|/usr/bin/cronolog [..]/logs/${origin}/log_%Y-%m.txt" combined
<VirtualHost *:80>
SetEnv origin SND
ServerName sandman.net
</VirtualHost>
Который, теоретически, породил бы только один процесс cronolog, который записывает в правильный файл журнала vhost.
Но кажется, что конвейерный коменд не анализируется для переменных Apache на любой стадии процесса, а это означает, что единственное решение, которое я вижу, это то, что я добавляю ${origin} в LogFormat, а затем пишу свой собственный скрипт rotate log это будет анализировать (и игнорировать) переменную vhost, а затем записывать оставшуюся часть строки журнала в соответствующий файл. Но будет ли это меньше накладных расходов?
Любые другие предложения?
2 ответа
Там всегда будет один случай cronolog
для каждого открытого файла журнала. Одно из решений здесь: http://httpd.apache.org/docs/2.2/logs.html. Предлагается просто добавить имя vhost в файл журнала, а затем разделить его на отдельные файлы, если это необходимо.
Другое возможное решение, которое вы предложили: напишите свою собственную программу / скрипт, которая разделит регистрацию на журналы для каждого vhost. Также может быть хорошей идеей отправить все в syslog и запустить программу расщепления на хосте syslog. Таким образом, apache будет держать открытым только один дескриптор файла для каждого типа журнала. Естественно, будут некоторые накладные расходы, но Apache не исчерпает лимит файловых дескрипторов.
Может быть, вы могли бы использовать именованную трубу.
как правило, предложение Хелраена довольно хорошее, но если вы сделаете это, вы пропустите ротацию (вы можете вызвать cronolog из syslog, но тогда могут потребоваться дополнительные очереди, чтобы уменьшить накладные расходы)
http://httpd.apache.org/docs/2.2/vhosts/fd-limits.html (взято из gelraen)
кроме этого, может быть, это хорошее время для распространения ваших виртуальных хостов. даже если вы не можете позволить себе настоящую машину, вы можете использовать виртуальную. Но я не думаю, что иметь все на одном сервере - это хорошая идея.