Назад | Перейти на главную страницу

Хронолог и ведение журнала виртуального хоста

Итак, я много лет использую cronolog с этой директивой:

<VirtualHost *:80>
  SetEnv origin SND
  ServerName sandman.net
  CustomLog "|/usr/bin/cronolog [..]/logs/SND/log_%Y-%m.txt" combined
</VirtualHost>

Проблема в том, что с большим количеством виртуальных хостов я внезапно достигаю максимального количества открытых файловых дескрипторов, когда apache порождает cronolog.

С некоторым поиском в Google (и поиском здесь) я не нашел решения для этого, так что нет его? Как видите, я установил для переменной ENV в Apache значение «SND» для этого виртуального хоста, и мне бы хотелось сделать что-то вроде этого:

CustomLog "|/usr/bin/cronolog [..]/logs/${origin}/log_%Y-%m.txt" combined
<VirtualHost *:80>
   SetEnv origin SND
   ServerName sandman.net
</VirtualHost>

Что, теоретически, порождает только один процесс хронолога, который записывает в правильный файл журнала vhost.

Но похоже, что рекомендация канала не анализируется для переменных Apache на любом этапе процесса, а это означает, что единственное решение, которое я вижу, это то, что я добавляю $ {origin} в LogFormat, а затем пишу свой собственный сценарий поворота журнала который проанализирует (и проигнорирует) переменную vhost, а затем запишет оставшуюся часть строки журнала в соответствующий файл. Но будет ли это меньше накладных расходов?

Есть другие предложения?

Всегда будет один экземпляр cronolog для каждого открытого файла журнала. Одно из решений здесь: http://httpd.apache.org/docs/2.2/logs.html#virtualhost Он предлагает просто добавить имя vhost в файл журнала, а затем, при необходимости, разбить его на отдельные файлы.

Другое возможное решение, которое вы предложили: напишите свою собственную программу / скрипт, который будет разбивать логирование на журналы для каждого виртуального хоста. Также может быть хорошей идеей отправить все в syslog и запустить программу разделения на хосте syslog. Таким образом, apache будет держать открытым только один файловый дескриптор для каждого типа журнала. Естественно, будут некоторые накладные расходы, но apache не исчерпает лимит файловых дескрипторов.

возможно, вы могли бы использовать именованный канал.

в целом предложение gelraen довольно хорошее, но если вы это сделаете, вы пропустите ротацию (вы можете вызвать cronolog из системного журнала, но тогда могут потребоваться дополнительные очереди, чтобы уменьшить накладные расходы)

http://httpd.apache.org/docs/2.2/vhosts/fd-limits.html (взято из gelraen)

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