Как работает logrotate?

Возможно, вы имели в виду:

export perl_script='
  $| = 1;
  s/\n/\r/g if $_ =~ /^AV:/;
  s/Saving state/\nSaving state/'

mpv=(command mpv)
args=("$@")
sh -c '
  "$@" 2>&1 |
    perl -p -e "$perl_script" | tee ~/mpv_all.log
 ' sh "${mpv[@]}" "${args[@]}"

Или если вы хотите внедрить содержимое всех этих аргументов в виде шелл-кода:

shquote() {
  LC_ALL=C awk -v q=\' '
    BEGIN{
      for (i=1; i<ARGC; i++) {
        gsub(q, q "\\" q q, ARGV[i])
        printf "%s ", q ARGV[i] q
      }
      print ""
    }' "$@"
}

perl_script='
  $| = 1;
  s/\n/\r/g if $_ =~ /^AV:/;
  s/Saving state/\nSaving state/'

mpv=(command mpv)
args=("$@")

sh -c "
  $(shquote "${mpv[@]}" "${args[@]}") 2>&1 |
  perl -p -e $(shquote "$perl_script") | tee ~/mpv_all.log"

Где shquoteзаключает в кавычки свой аргумент в синтаксисе sh(заключает аргументы в '...'и заменяет 'на'\'').


6
18.01.2020, 15:19
1 ответ

Поскольку вы создаете свои собственные лог-файлы и вам требуется более реальное -измельчение размера по времени, вам следует взглянуть на утилиту 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 имеет современный, менее подробный вариант.

4
28.04.2021, 23:25

Теги

Похожие вопросы