Назад | Перейти на главную страницу

Предотвращение перезаписи файлов с помощью dateext в logrotate

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

Есть ли надежный способ запретить dateext перезаписывать существующие файлы, а вместо этого создать другой файл ?. Допустимо, что либо ротация не происходит, либо создается файл с менее предсказуемым именем (дата с дополнительным числом, время или что-то еще).

dateext поддерживает %s спецификатор формата - время эпохи Unix в секундах.

Если вы установите формат даты как .%Y-%m-%d.%s, это будет выглядеть так:

logfilename.2012-12-11.13572638495

Это меняется каждую секунду, поэтому шансы двух одинаковых файлов очень удаленный.

Вы можете использовать prerotate / endcript, чтобы убедиться, что нет файла с тем именем, которое вы собираетесь использовать, но если вас беспокоит ротация, происходящая в любое нечетное время, это может быть сложно. В худшем случае у вас одновременно выполняется два ротации одного и того же файла (2-й запускается до завершения 1-го), и если оба определяют, что конфликта имен нет, то один будет перезаписывать другой.

Более простой подход может заключаться в изменении повернутого имени файла для включения более точной даты, например включая наносекунды в метку времени. Это должно сделать очень маловероятным конфликт имен. Если вы хотите быть уверены в отсутствии конфликта имен, используйте mktemp, но тогда вы получите «уродливые» имена. Логика такого изменения имени должна перейти в раздел prerotate | postrotate / endcript конфигурации logrotate.