Добавить в сжатый журнал

370
Orient

Существует несколько z-утилит ( zless, zcat), которые могут прозрачно читать содержимое zip-файла.

Можно ли добавить в сжатый файл журнала (в любом формате, не обязательно gzip)?

Я хочу что-то вроде следующего ( zteeэто воображаемая утилита с интересующей функциональностью):

echo "[ $( date ) ] message" | ztee -a file.log.gz 
1
Вы пробовали это? Каков был результат? Seth 6 лет назад 0
@ Сид пробовал что? Orient 6 лет назад 0
Ну, у вас действительно есть команда прямо там. Вы пытались запустить его, предполагая, что ztee существует? Также взгляните на [man-страницу для zless] (https://linux.die.net/man/1/zless), так как она может дать вам еще несколько потенциальных клиентов. Seth 6 лет назад 0
@ Сидит, где я командую? `ztee` не существует. Я знаю о существовании "zless" - как оно может помочь мне решить проблему? Если я запускаю мнимый псевдокод в оболочке, то я точно получаю ошибку. Наверняка. Конечно, я не пытался запустить его. На самом деле предположение о существовании `ztee` мне ничего не дает в реальной жизни. Orient 6 лет назад 0
Вы не сделали это ясно. Страница man показывает, что на самом деле делает `zless` (более или менее псевдоним для` gzip`). Гравити уже нашел время, чтобы объяснить, что ты можешь сделать, и ты принял это как ответ. Страница man `gzip` содержит примеры, которые делают то же самое. Seth 6 лет назад 0
@ Сидеть и .... что? Вы только что перечислили мелочи. Чего ты хочешь? Orient 6 лет назад 0
Я предоставляю обратную связь, чтобы вы могли задавать лучшие вопросы в будущем и причину, по которой я упомянул справочную страницу. Seth 6 лет назад 0
@ Сидит Спасибо. Возможно проблема (моя) в языковом барьере. Orient 6 лет назад 0

1 ответ на вопрос

3
grawity

Да, но это бесполезно.


Некоторые сжатые форматы файлов - в том числе те, которые используются gzip, bzip2и xz- делать поддержки конкатенации изначально. (Это может потребовать явного согласия при использовании низкоуровневых API, но декомпрессоры командной строки принимают его по умолчанию.)

echo "test 1" | gzip >> log.txt.gz echo "test 2" | gzip >> log.txt.gz echo "test 3" | tee >(gzip >> log.txt.gz) echo "test 4" | (tee /dev/fd/3 | gzip >> log.txt.gz) 3>&1 zcat log.txt.gz 

(Обратите внимание, что, например zcat, буквально просто оболочка для шеллскрипта для gunzip...)

Однако это означает, что каждое сообщение журнала сжимается индивидуально, без учета всего предыдущего содержимого. В результате, если вы попытаетесь связать много коротких сообщений в журнале, ваши коэффициенты сжатия будут очень и очень плохими. (В моих тестах, сжимающих случайный файл журнала таким образом, результирующий файл фактически увеличился до 120% от своего первоначального размера из-за всех повторяющихся издержек «заголовка».)

$ dmesg > test.log $ cat test.log | gzip > test-single.log.gz $ cat test.log | while read -r line; do echo "$line" | gzip done > test-concat.log.gz $ du -h test* 500K test-concat.log.gz 416K test.log 64K test-single.log.gz 

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

#!/bin/bash  # open a subprocess (the bash equivalent of 'popen') coproc LOG { gzip >> log.txt.gz; }  echo "doing stuff" >&$ echo "doing more stuff" >&$ echo "still doing stuff" >&$  # close its stdin to finish compression exec >&- 

В «стандартной» оболочки, вы можете достичь того же с помощью именованных каналов, или даже более просто перенаправляет весь сценарий через gzip. (Просто напечатайте одно и то же сообщение один раз на стандартный вывод и один раз на стандартный вывод, и вы получите свое tee.)


Дополнительная информация о сцеплении сжатых потоков:

Поэтому с минимальной полезностью требуется перечитать весь файл. Я не хочу терять промежуточный прогресс в случае случайного сбоя системы. Orient 6 лет назад 0
Тогда просто не сжимайте активные журналы в первую очередь. Чем больше сложность, тем больше вероятность того, что она как-то потерпит неудачу. grawity 6 лет назад 2
В конце концов я пришел к тем же выводам. Спасибо. Orient 6 лет назад 0