Более простой способ проверить и протестировать конфигурацию logrotate - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь настроить logrotation, чтобы вращать журналы ежедневно, в течение 14 дней. Во время пост-поворота, он будет вызывать отдельный скрипт для регистрации любого журнала старше 10 дней. Файлы старше 14 дней будут удалены.

Пока что вращение работает нормально, но у меня возникли проблемы с тестированием, учитывая временную шкалу, необходимую для этого. Можно ли как-нибудь протестировать эту настройку так, чтобы не пришлось ждать 14 дней, поскольку это не очень практично.

Кроме того, здесь приведены мои настройки и сценарий tar. Что-то не так с учетом моих требований?

logrotate.conf

/home/user1/services/logs/*/*.log{
# Rotate logs daily
daily
copytruncate
missingok
notifempty
# Keep 14 days worth of backlogs
rotate 14
maxage 14

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext
dateformat .%Y-%m-%d

# compress your logs
nocompress

#postrotate scripts to tar logs that are too old.
postrotate
    /home/user1/service/logrotate/archive.sh
endscript

}

архив. sh:

#!/bin/bash

rotateDate=[0-9]{4}-[0-9]{2}-[0-9]{2}

shopt -s nullglob

for file in $HOME/services/logs/*/*.log.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]; do
    log=$(basename "$file")
    find . -type f -mtime +10 | tar -zcvf "$file.tar" "$log"
done

Редактировать: Запустив мой скрипт ночью я заметил, что archive.sh работает неправильно. Вместо того, чтобы находить старые файлы и проверять их, я вижу, что файл журнала, который был повернут прошлой ночью, был тарифицирован.

У меня должно быть:

test.log
test.log.2020-04-09
test.log.2020-04-08

и затем я не вижу никаких таров до тех пор, пока файлу не исполнится 10 дней.

Вместо этого у меня есть:

test.log
test.log.2020-04-09
test.log.2020-04-09.tar
test.log.2020-04-08
test.log.2020-04-08.tar

1 Ответ

0 голосов
/ 16 апреля 2020

Я не очень разбираюсь в logrotate.conf.


Однако, для вашего второго вопроса: пожалуйста, посмотрите на эти заархивированные файлы журнала, являются ли они даже правильными и нет содержат одинаковое содержимое во всех них.

Что вы в настоящее время делаете:

Для каждого $file, соответствующего вашему выражению глобуса:

  • Поиск все файлы старше 10 дней (не только $file)
  • Отменить результат и вызвать tar -zcvf "$file.tar" "$log"

Таким образом, вы должны включить имя файла в введите команду find и используйте вывод find в качестве аргументов для tar (например, используя xargs):

for file in $HOME/services/logs/*/*.log.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]; do
    log=$(basename "$file")
    find . -iname "$file" -type f -mtime +10 | xargs tar -zcvf "$file.tar"
done

Если в именах файлов есть пробелы, рассмотрите параметры -print0 для find и -0 для xargs

или без xargs используйте параметры -T - для tar:

find . -iname "$file" -type f -mtime +10 -print0 | tar -zcvf "$file.tar" --null -T  -

Однако конкретные параметры могут зависеть от вашего версия tar: Как мне собрать tar из стандартного ввода?

...