Поскольку вы создаете свои собственные лог-файлы и вам требуется более реальное -измельчение размера по времени, вам следует взглянуть на утилиту Apache rotatelogsздесь .
Он работает, читая стандартный ввод, и нарезает файл журнала на основе аргументов командной строки.
напр.
program-writing-to-stdout|/bin/rotatelogs /home/mike/tmp/qqq.log 1M"
logrotate , с другой стороны, проверяет файлы журналов при запуске, и обычно системы настроены на запуск logrotate (через cron )один раз в день. Конфигурация подсистем -обычно выполняется путем перетаскивания файла конфигурации в /etc/logrotate.d
, и да, обычно он запускается от имени пользователя root.
Редактировать :@mike грызун
logrotate
запускается (с помощью cron или вручную ), а затем проверяет статистику файла журнала, как показано в файловой системе -, затем запускает ротацию в зависимости от своей конфигурации.
rotatelogs
считывает стандартный ввод, непрерывно добавляя к файлу журнала, затем, когда время или размер файла журнала достигает триггерной точки -, он закрывает текущий файл журнала, создает новый файл журнала (с соответствующим именем ), затем продолжает добавляться в новый файл журнала.
Это имеет отношение к тому, как вы запускаете программу, которая генерирует выходные данные, она должна записывать в стандартный вывод, а затем вы передаете это в журналы rotatelog.
например,
while true ; do date ; sleep 30 ; done | rotatelogs -n 10 /home/mike/tmp/qqq.log 60
Дает вам круговое вращение через 10 файлов, разрезая каждые 60 секунд
Используя rclone
, я ожидаю, что --log-file "/dev/stdout"
заставит его записывать в стандартный вывод.
[править 2] @mike грызун
Я не знаком с rclone, пишет ли он в stdout или stderr, и если что-то пишет в любой из них, но есть способы обойти это, даже если --log-file=/dev/stdout
не работает.
Этот StackOverflow Q/Answer среди прочего объясняет перенаправление и конвейерную передачу. Но подводя итог, можно перенаправить только stderr или объединить с stdout в канал.
Пример Баша:
Объединить stderr с stdout в канал
FirstCommand 2>&1 | OtherCommand
Только stderr в канал, stdout в otherfile (, который может быть /dev/null или даже просто дефисом -
, который закрывает stdout ).
FirstCommand 2>&1 1>otherfile.log | otherCommand
В этих примерах используется старый синтаксис bash, bash v4 имеет современный, менее подробный вариант.
Этот рецепт сработал для меня прямо сейчас. YMMV.
Измените DSTPATH
на место, где вы хотите установить это расширение.
Я НЕ рекомендую устанавливать вообще что-либо вручную в системные каталоги (, например. под/usr
); это должно управляться только инструментами дистрибутива (apt
, yum
и т. д. ).
DSTPATH=/tmp/baz
set -e
git clone https://git.code.sf.net/p/gawkextlib/code gawkextlib-code
cd gawkextlib-code/lib
autoreconf -i
./configure --prefix=$DSTPATH && make -j13 install
cd../csv
autoreconf -i
./configure --prefix=$DSTPATH --with-gawkextlib=$DSTPATH && make -j13 install
export AWKPATH=$DSTPATH/share/awk AWKLIBPATH=$DSTPATH/lib/gawk
echo foo,bar,baz | gawk -i csv 'csvsplit($0,a){print a[2]}'
Все это, ИМХО, излишне, и есть тысячи причин, по которым это может привести к сбою (отсутствие надлежащих инструментов разработки и т. д. ).
Отложив дискуссию об установке в /usr -Основная проблема, которую я обнаружил при сборке библиотеки csv, заключается в том, что в Makefile не указан путь среды выполнения , необходимый для поиска gawkextlib при компоновке csv.so
библиотека. Это означает, что без установки LD_LIBRARY_PATH
csv.so
не найдет libgawkextlib.so.0
во время выполнения, даже если сборка и установка будут выполнены успешно. Результатом является такая ошибка при вызове gawk:
gawk: csv:15: fatal: load_ext: cannot open library `/usr/local/lib/gawk/csv.so' (libgawkextlib.so.0: cannot open shared object file: No such file or directory)
gawk находит csv.so
в /usr/local/lib/gawk/csv.so
, но csv.so
затем зависит от libgawkextlib.so.0
, который не находится на пути к библиотеке времени выполнения.
Я не смог найти вариант в configure
для решения этой проблемы и в итоге снова запустил строку ссылки из вывода make, но добавил следующее :-Wl,-rpath,/usr/local/lib
-Wl
отправляет следующие опции прямо на ссылку из gcc
.
Таким образом, полная строка :gcc -shared -fPIC -DPIC .libs/csv.o.libs/csv_parser.o.libs/csv_convert.o.libs/csv_split.o.libs/csv_input.o.libs/strbuf.o.libs/awk_fieldwidth_info.o -L/usr/local/lib/ -Wl,-rpath,/usr/local/lib -L/usr/local/bin -lgawkextlib -g -O2 -Wl,-soname -Wl,csv.so -o.libs/csv.so
После этого csv.so
смог найти libgawkextlib.so.0
без моих манипуляций с путем поиска библиотеки:
$ ldd csv.so
linux-vdso.so.1 (0x00007ffda36e6000)
libgawkextlib.so.0 => /usr/local/lib/libgawkextlib.so.0 (0x00007ffb8f535000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffb8f144000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffb8f93d000)
Таким образом, общая процедура для меня на Ubuntu 18.04 была следующей: я использовал версию gawk, ранее собранную из исходного кода и установленную по адресу /usr/local/bin/gawk
. Также обратите внимание, что у меня уже установлены все инструменты сборки, вам может понадобиться использовать apt
для установки gcc, autoconf, libtool и т. д. -хорошей отправной точкой является sudo apt install build-essential
.
Получить источник:
git clone git://git.code.sf.net/p/gawkextlib/code gawkextlib
cd gawkextlib
Build lib -здесь ничего особенного-with-gawk
просто гарантирует, что мы используем нашу скомпилированную версию gawk,не системная версия:
cd lib
autoreconf -i
./configure --with-gawk=/usr/local/bin/
make
sudo make install
Расширение сборки csv с патчем для библиотеки:
cd../csv
autoreconf -i
./configure --with-gawk=/usr/local/bin/ --with-gawkextlib=/usr/local/lib/
make
gcc -shared -fPIC -DPIC .libs/csv.o.libs/csv_parser.o.libs/csv_convert.o.libs/csv_split.o.libs/csv_input.o.libs/strbuf.o.libs/awk_fieldwidth_info.o -L/usr/local/lib/ -Wl,-rpath,/usr/local/lib -L/usr/local/bin -lgawkextlib -g -O2 -Wl,-soname -Wl,csv.so -o.libs/csv.so
sudo make install
Успех:
$ echo foo,bar,baz | gawk -i csv 'csvsplit($0,a){print a[2]}'
bar
Последняя подсказка -, если у вас есть проблемы с makeinfo
не установленными -на Ubuntu:
sudo apt-get install texinfo