Журналы вращаются быстрее, чем интервал выполнения пакетных заданий cron - PullRequest
1 голос
/ 23 ноября 2011

У нас есть журналы приложений, которые чередуются по размеру, т.е. Каждый раз, когда журнал достигает 1 МБ, файл журнала изменяется с abc.log на abc.log.201110329656 и так далее. Когда это происходит, abc.log начинается снова с 0mb. Частота вращения бревна составляет около 30 минут.

У нас есть фоновое задание cron, работающее в фоновом режиме с abc.log, которое проверяет наличие nullpointerexception каждые 30 минут.

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

Есть ли способ решить эту проблему? Нет, я не могу изменить поведение журнала приложения, размера, имени или ротации. Я не могу изменить частоту cron-интервала, который установлен на 30 минут. Тем не менее, я могу свободно изменять другие вещи пакетного задания, которые являются сценарием bash.

Как это можно решить?

Ответы [ 2 ]

4 голосов
/ 23 ноября 2011

find(1) ваш друг:

$ find /var/log/myapp -cmin -30 -type f -name 'abc.log*'

Это дает вам список всех файлов журналов в /var/log/myapp, к которым обращались за последние 30 минут. Пусть ваш скрипт работы cron работает на всех этих файлах.

1 голос
/ 23 ноября 2011

Вы в значительной степени указали, в чем проблема:

  • У вас есть журнал, который автоматически катится, когда журнал достигает определенного размера.
  • У вас есть другая работа, котораяработает с файлом журнала, и только с файлом журнала.
  • Нельзя настроить список журналов и настроить его, когда происходит проверка журнала.

Таким образом, если файл журнала изменяется, вы ищете не тот файл.Можете ли вы проверить все файлы журнала, которые вы ранее не проверяли с помощью пакетного скрипта?Или вам разрешено только проверять текущий файл журнала?

Один из способов сделать это - отслеживать, когда вы в последний раз проверяли файлы журнала, а затем проверять все те файлы журнала, которые были новее, чем в прошлый раз, когда высделал проверку.Для этого вы можете использовать файл с именем last.check.В этом файле нет содержимого (содержимое не имеет значения), но вы используете временную метку для этого файла, чтобы выяснить, когда в последний раз работал ваш журнал.Затем вы можете использовать touch для изменения метки времени после успешной проверки журналов:

last_check="$log_dir/last.check"
if [ ! -e "$last_check" ]
then
    echo "Error: $last_check doesn't exist"
    exit 2
fi
find $log_dir -newer "$last_check" | while read file
do
    [Whatever you do to check for nullpointerexception]
done
touch "$last_check"

Вы можете создать исходный файл $last_check с помощью команды touch:

$ touch -m 201111301200.00 $log_dir/last.check  #Touch date is in YYYYMMDDHHMM.SS format

Использование сенсорного файла обеспечивает большую гибкость в случае изменения ситуации.Например, что если вы решите в будущем запускать crontab каждый час, а не каждые 30 минут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...