Люди, есть ли решение * nix, которое сделало бы файл журнала действовать как кольцевой буфер? Например, я хотел бы, чтобы в файлах журналов сохранялось максимум 1 ГБ данных и удалялись старые записи после достижения предела.
Это вообще возможно? Я считаю, чтобы добиться того, чтобы файл журнала был превращен в какое-то специальное устройство ...
PS Я знаю о разных инструментах logrotating, но это не то, что мне нужно. Logrotating требует большого количества операций ввода-вывода, обычно происходит один раз в день, в то время как мне нужно решение «времени выполнения».
tail -f somefile
сделал бы это. Я только что попробовал с повернутыми журналами иtail -f
не работает с ними.Ответы:
В Linux есть кольцевой буфер ядра. Вы можете использовать
dmesg
для отображения .Или вот модуль ядра Linux, который, кажется, делает то, что вы хотите.
источник
Самая близкая вещь, о которой я могу думать, - это RRDTools, но, вероятно, это не то, что вы ищете. Другим решением было бы отслеживать файл журнала (скажем, каждую секунду или в Linux с inotify), например, вы пишете скрипт вроде:
с inotify:
источник
Вы можете использовать multilog из Daemontools в djb. Вы перенаправляете свой лог в него. Да, это ротация логов, но ротации это просто:
Который практически на любой современной файловой системе Linux - это супер быстрая операция. Вы можете указать, сколько журнальных файлов вы хотите, сколько вы хотите их. создайте файлы размером 10 x 1024 Мб, и вы получите кольцевой буфер объемом 1 Гб.
Обратите внимание, что из-за автоматического поворота это один источник для каждого экземпляра мультилога. Но вы можете обойти это, написав простую оболочку с Netcat или вручную.
источник
Вы можете создать канал FIFO, а затем прочитать его, используя скрипт, который вставляется в базу данных. Когда счетчик достигнет 1000, перезапустите идентификатор, вставляемый в базу данных. Конечно, не подходит для размера, но вы использовали это в качестве примера, так что я предполагаю, что это теоретический вопрос.
источник
Интересный вопрос; Вы обычно не видите это как дизайн. У меня есть программа, которая использует слегка похожую технику для записи истории, но она использует двоичный формат. «Файл журнала» состоит из четырех частей, все они представлены в машинно-нейтральном формате:
Когда выделяется новая запись, если в свободном списке есть место, тогда она перезаписывает запись там (необязательно используя все это - в этом случае фрагмент остается в свободном списке). Когда в свободном списке нет места, в конце выделяется новое место. Когда старая запись вращается, ее пространство перемещается в свободный список и объединяется с любыми соседними бесплатными записями. Он предназначен для обработки операторов SQL, поэтому записи могут быть распределены по многим строкам. Этот код работает с указанным количеством записей. Он не ограничивает размер файла как такового (хотя сделать это будет несложно).
Основной код истории кода находится в двух файлах history.c и history.h, доступных из источника для программы SQLCMD (моя версия, а не Microsoft; моя существовала за десять или более лет до Microsoft), которую можно загрузить с архив программного обеспечения Международной группы пользователей Informix . Существует также программа для выгрузки файла истории (histdump.c) и тестер истории (histtest.ec - он претендует на то, чтобы быть ESQL / C, но сам по себе является кодом C; одна из функций поддержки, которую он вызывает, использует некоторый Informix ESQL / C библиотечные функции). Свяжитесь со мной, если вы хотите экспериментировать без использования Informix ESQL / C - смотрите мой профиль. Существуют некоторые тривиальные изменения, которые необходимо сделать, чтобы он скомпилировал историю за пределами его среды проектирования, плюс вам нужен make-файл.
источник
Я согласен с комментариями pehrs на ваш вопрос. Вращение журнала не так сложно. Вы можете настроить logrotate или другой скрипт для периодической проверки вашего файла журнала, даже если вам так хочется, каждую минуту. Когда он обнаруживает, что ваш файл достигает 1 ГБ, он просто выполняет переименование, которое не требует ввода-вывода. Во время переименования процесс продолжает запись файла журнала. Журнал ротатор может отправить HUP на ваш демон системного журнала (ваш демон будет логирование через системный журнал, верно? Если нет, то он должен поддерживать сигнал HUP , если это хорошо написано ...) , чтобы он повторно открыть исходный путь к файлу , В этот момент он начнет запись в новый файл по первоначальному пути, и вы сможете удалить повернутую версию.
источник