У меня есть длительная команда, которая генерирует большой вывод на стандартный вывод. Я хотел бы иметь возможность сохранить, например, только последние три дня или последний гибибайт (избегая линий разреза посередине) и, если возможно, в файловых фрагментах размером не более 20 МБ. Каждому фрагменту файла присваивается числовой суффикс или отметка времени.
Что-то вроде:
my-cmd | magic-command --output-file-template=my-cmd-%t \
--keep-bytes=1G \
--keep-time=3d \
--max-chunk-size=20M \
--compress=xz
Написал бы:
my-cmd-2014-09-05T10:04:23Z
Когда он достигает 20M, он сжимает его, открывает новый и т. Д., А через некоторое время начинает удалять самые старые файлы.
Существует ли такая команда?
Мне известно о logrotate
его способности управлять файлами, написанными другими приложениями, но я ищу что-то более простое, не требующее настройки задания cron, задания правил, приостановки процесса и т. Д.
text-processing
logs
utilities
Стефан Шазелас
источник
источник
Ответы:
Вы можете получить то, что вам нужно, через pipelog , который «позволяет вращать или очищать журнал запущенного процесса, пропуская его через промежуточное звено, которое реагирует на внешние сигналы», например:
Затем вы можете получить pid от
/tmp/spewpipe.pid
:Но это вы должны настроить cron или что-то. Однако здесь есть одна загвоздка. Обратите внимание:
gzip spew.log.1
это потому, что-x
команда выполняется после ротации журнала. Таким образом, у вас есть дальнейшая проблема перезаписиspew.log.1.gz
каждый раз, если вы не напишете короткий скрипт, чтобы выполнить gzip, затем переместить файл и использовать его в качестве-x
команды.Полное раскрытие: я написал это, так что, конечно, работает отлично . ;) Я буду иметь в виду вариант сжатия или что-то, что лучше облегчает его, для версии 0.2 (цель предназначения
-x
несколько иная, но она будет работать, как указано выше). Также неплохо использовать автоматическое переключение ... первая версия преднамеренно минимальна, так как я не поддался соблазну добавить ненужные функции (в конце концов, для этого не так сложно настроить работу cron).Обратите внимание, что он предназначен для вывода текста ; если есть потенциальные нулевые байты, вы должны использовать
-z
- который заменяет ноль чем-то другим. Это был компромисс для упрощения реализации.источник
pipelog-0.3
;-). Я также наткнулся на metacpan.org/release/File-Write-Rotate . Обратите внимание, что задания cron мало помогут при ротации в зависимости от размера файла.Dan Бернштейна Multilog , по- видимому это сделать - или , возможно , большинство из них, обеспечивая при этом выход через дескрипторы файлов для процессора! Чтобы компенсировать разницу , как вам нравится - хотя размер спецификации 20M / 1G может занять некоторое finagling , как это кажется 16М является его внешний лимит на бревно. Далее следует, в большинстве случаев, выбор «копировать + вставить» по приведенной выше ссылке, хотя в ссылке также указаны другие параметры, такие как отметка времени на строку, поддержание [других] файлов, содержащих только самые последние шаблоны соответствия строк, и многое другое. ,
Интерфейс
... скрипт состоит из любого количества аргументов. Каждый аргумент определяет одно действие. Действия выполняются по порядку для каждой строки ввода.
Выбор линий
Каждая строка изначально выбрана. Действие...
... отменяет выбор линии, если шаблон соответствует линии. Действие...
выбирает линию, если шаблон соответствует линии.
... шаблон представляет собой цепочку звезд и не звезд. Он соответствует любой последовательности строк, совпадающей со всеми звездами и не звездами в одном и том же порядке. Не звезда соответствует самому себе. Звезда перед концом шаблона соответствует любой строке, которая не включает следующий символ в шаблоне. Звезда в конце шаблона соответствует любой строке.
Автоматически вращаемые журналы
Если dir начинается с точки или косой черты, то действие ...
... добавляет каждую выбранную строку в журнал с именем dir . Если dir не существует,
multilog
создает его.Формат журнала выглядит следующим образом:
dir - это каталог, содержащий некоторое количество старых файлов журнала, файл журнала с именем current и другие файлы для
multilog
отслеживания его действий.Каждый старый файл журнала имеет имя, начинающееся с @ , продолжающееся точной отметкой времени, показывающей, когда файл был завершен, и заканчивающееся одним из следующих кодов:
Действие...
... устанавливает максимальный размер файла для последующих действий dir .
multilog
решит, что ток достаточно велик, если ток имеет размер в байтах. (multilog
также решит, что current будет достаточно большим, если увидит новую строку в пределах 2000 байт от максимального размера файла; он попытается завершить файлы журнала на границах строк.) Размер должен быть между 4096 и 16777215. Максимальный размер файла по умолчанию - 99999.В версиях 0.75 и выше: если
multilog
получает сигнал ALRM , он немедленно решает, что ток достаточно велик, если ток непустой.(Примечание: я подозреваю, что
zsh
schedule
встроенную функцию можно легко убедить отправить черезALRM
определенные интервалы, если это необходимо.)Действие...
... устанавливает количество файлов журнала для последующих действий dir . После переименования текущего , если
multilog
видит num или более старых файлов журнала, он удаляет старый файл журнала с наименьшей отметкой времени. num должно быть не менее 2. Число файлов журнала по умолчанию - 10.Действие...
... устанавливает процессор для последующих действий dir .
multilog
будет передавать ток через процессор и сохранять вывод как старый файл журнала вместо текущего .multilog
также сохранит любой вывод, который процессор записывает в дескриптор 5, и сделает этот вывод читаемым в дескрипторе 4, когда он запустит процессор в следующем файле журнала. Для надежности процессор должен выходить не равным нулю, если у него есть какие-либо проблемы при создании выходных данных;multilog
затем запустим его снова. Обратите внимание, что работающий процессор может заблокировать любую входную информацию для программыmultilog
.источник
Лучшее, что я смог найти в качестве приближения, не связанного с написанием огромных кусков кода, это следующий
zsh
код:Здесь разбиваются и вращаются не более 51 20MiB больших файлов.
источник
btrfs
также может быть установлен сcompress-force=zlib
.Вот взломанный скрипт на python, чтобы сделать что-то вроде того, что вы запрашиваете:
источник
exec
в первую очередь использует python вместо использованияpython
илиenv python
hashbang?