Изменение способа ротации файлов журнала LogRotate по умолчанию
Мое наблюдение за logrotation заключается в том, чтобы вращать любой файл журнала, процесс logrotate, в следующем порядке.
- копирует рассматриваемый файл журнала (назовем его file1.log) с новым именем (добавляя отметку времени или число к существующему имени, чтобы он стал file1.log-20140513),
- удаляет существующий файл (file1.log) и создает новый пустой файл журнала с исходным именем (file1.log),
- сжимает повернутый файл (file1.log-20140513), который создает новый сжатый файл (file1.log-20140513.gz), если установлена опция сжатия,
- удаляет повернутый файл (file1.log-20140513) и, наконец,
- перейти к следующему файлу, чтобы сделать то же самое выше 4 шага к нему.
У меня возникла следующая проблема с этим процессом:
- Мои файлы журналов огромны по размеру (более 10 Гб каждый), и у меня есть около 42 таких файлов журналов.
- Процессы, которые записывают в эти файлы, работают синхронно,
- DiskIO на сервере - это хорошо, но, тем не менее, копирование требует времени, а сжатие также требует времени, а сжатие также потребляет процессор.
- Я хочу, чтобы все вновь созданные файлы журналов имели журналы, начинающиеся с одного и того же времени.
Для этого я хочу переместить logrotate, что делает команда mv, которая переименовывает файлы, а не копирует их. Что касается сжатия, я могу отключить это и запустить его через другой скрипт, запланированный через cron. Но я хочу, чтобы logrotate перемещал файлы, а не копировал их.
Теперь, я уверен, что это то, о чем авторы logrotate тоже подумали бы, поскольку это, очевидно, экономит дисковый ввод-вывод и время, затрачиваемое на выполнение всей операции logrotate, поэтому я хочу узнать, почему файлы копируются, а не перемещаются или переименовываются, и как я могу достичь этого через logrotate.
ПРИМЕЧАНИЕ. Я попытался сделать это вручную, то есть переместить файл, в который тоже записывал запущенный процесс, и создать новый пустой файл с тем же именем и теми же разрешениями (который является root, что также является разрешением, которым является процесс). с помощью), но после перемещения и создания нового файла я увидел, что процесс ничего не записывает в него, поэтому пришлось перезапустить процесс, чтобы он записал в этот файл. Может ли кто-нибудь также объяснить это поведение относительно того, почему logrotate удается заставить процесс записывать в тот же файл, но я не могу использовать простые шаги.
2 ответа
Поведение, которое вы описываете, происходит только в том случае, если logrotate было явно сказано сделать это через copytruncate
директивы. Документация предупреждает о возможности потери некоторых данных журнала из-за этого поведения. Эта директива должна использоваться только в качестве крайней меры.
Стандартный метод ротации лог-файлов - переименование, а затем отправка сигнала процессу, чтобы он мог открыть новый лог-файл. Это быстрее и не рискует потерять часть журнала. Но для этого требуется, чтобы процесс записи мог переключиться на новый файл журнала.
Сжатие может быть отключено или отложено до следующего поворота. Если compress
директива используется, старые файлы журналов сжимаются. Если эта директива не используется, они не сжимаются.
Если оба compress
а также delaycompress
используются, сжатие задерживается до следующего поворота. Таким образом, после каждого поворота два новейших файла журнала еще не будут сжаты.
после перемещения и создания нового файла я увидел, что процесс ничего не записывает в него, поэтому пришлось перезапустить процесс, чтобы он записал в этот файл
Процесс записывает в один и тот же файл, поэтому регистрируйте копию вместо перемещения. Когда вы удаляете журнал, процесс все равно записывает в журнал, и вы можете видеть рост использования файловой системы, но нет файла. Перезапуск процесса освободит место на диске.
считать
- Меньше пишите в журналы, нужна ли вся регистрируемая информация?
- прочитайте документацию, например: http://www.thegeekstuff.com/2010/07/logrotate-examples/