А что если написать демона на C который будет слушать сокет, и принимать логи, а затем писать их куда надо и в каком надо формате. Всяко мультипоточность на С организовать проще чем на php.
это вариант - если вы имеет ввиду модуль к пхп типа длл или so
но тут у меня возникает вопрос (я не силен в си вообще) - а сможет ли модуль этот писать многопоточно в файл и выстраивать очередь из записей в лог ? (у меня пхп под fast-cgi)
В Си это возможно, т.к. у меня уровень только в написании модуля, а-ля Hello World, то увы не ко мне с советом, т.к. я еще и под винду это делал, а не под никсы.
А если какждый поток будет создавать свой лог, а отдельный скрипт будет собираться их в кучу по нужному алгоритму и подчищать?
Или например РНР будет создавать для каждого потока лог s893ffff.log и делать exec команды типа tail s893ffff.log > log перекладывая гимор на систему ? :)
Я не разбирался с работой несколких потоков, но мысль есть. В начале работы приложения генерируем случайное имя файла, в процессе работы пишем в него. После записи нужно отметить, что запсиь лога завершена. Это можно сделать установив атрибут файла, либо записать что-нибудь в конец файла.
По расписанию запускается сборщик логов, ищет файлы, которые имеют метку конца записи (если скрипт пишущий в лог вылетел с ошибкой, и метки конца записи нет, проверять дату модификации). Затем, логи пишутся в один файл, оригинальные логи удаляются.
речь идет о потоках фаст-цги - каждый запущеный интерпритатор - это поток который пишет в файл логов...
я уже склоняюсь к syslog либо error_log либо аналогичному расширению для пхп заточеного под собстыенные нужды
а, понял - речь идет о нескольких _процессах_ и нужно писать в один файл и нормально ротироваться.
- запускаем ОДИН процесс
- делаем $hLog = fopen логфайла
- делаем fork() сколько надо раз
- в детках спокойно пишем в $hLog обычным fwrite
- обрабатываем какой-нибудь сингал (например HUP) по которому логфайл переоткрываем, при ротации файл переименовываем (но не перемещаем на другое устройство!) и шлем сигнал. т.к. хэгдл открытого файла увязан на inode а не на имя файла, до переоткрытия по сигналу все будет писаться в старый файл.
не пойдет форк из-за специфика приложения... грубо говоря это пхп скрипт обрабатывающий запросы юзеров - и он должен писать логи в один файл из разных процессов...
когда юзер 100 - еще ничего - flock хватает - а когда их сразу 10к - флок загибает сервер :)
поэтому наверное решение приму переходить на syslog, error_log либо самописного демона
просто у наших програмеров был опыт работы с log4c++ - и там дела обстоят просто супер - и масштабируемость неплохая - поэтому решили взять log4php - однако не протестили на реальной нагрузке - это нам наука - будем исправляться
Вариант вот какой — создать FIFO файл и на читающий конец повесить слушателя, который бы постоянно вычитывал оттуда записи в неблокирующем режиме в память (ту же самую FIFO очередь, но внутри памяти и не ограниченную лимитами система на FIFO файл), и в то же время писал бы эти данные в неблокирующем режиме из конца очереди в памяти сразу в файл. Получится что спокойно можно в несколько потоков писать в этот FIFO файл с другого конца применяя блокировки, поскольку вычитка с другого конца будет происходить моментально. Пример реализации (правда немного для других цели и с другой идеологией) можно подсмотреть в моей заметке о хитростяъх с логированием в однопоточных неблокирующих веб-серверахю
log4php или что-то другое?