Да, есть правильный способ: вы вообще не очищаете логи. Вы вращаете их. Вращение включает переключение вывода журнала в новый файл с тем же именем, причем предыдущие N файлов журнала хранятся под набором из N связанных имен файлов.
То, как человек вращает логи, зависит от того, как они пишут их. Это часто упускается из виду. Некоторые из приведенных здесь ответов касаются этого, по крайней мере, упоминая, что некоторые программы ведения журналов сохраняют дескриптор открытого файла для файла журнала, поэтому простое удаление файла не освобождает место и даже не переключает вывод на новый файл журнала.
Если программа, записывающая файл журнала , например, multilogиз daemontoolsпакета , то вы ничего не делаете, чтобы вращать журналы вообще - никаких ручных сценариев, никаких cronзаданий. Просто скажите, multilogчто выходные данные журнала находятся в каталоге, и он будет поддерживать автоматически повернутый и ограниченный по размеру набор из N файлов журнала в этом каталоге.
Если программа, записывающая файлы журнала svlogdиз runitпакета , для другого примера, то же самое применимо. Вы ничего не делаете, кроме указания инструмента на каталог. Он сам будет поддерживать автоматически повернутый и ограниченный по размеру набор из N файлов журнала в этом каталоге.
Если вы используете rsyslogдля записи файлов журнала, то программе регистрации может быть приказано остановиться после того, как файл журнала достигнет определенного размера, и запустить скрипт . Вы должны написать основную часть сценария, чтобы фактически переименовать файл журнала и удалить старые файлы журнала, основываясь на ограничениях общего размера, но, по крайней мере, программа ведения журнала закрыла файл и приостановила запись журнала, пока это происходит.
Старый syslogdспособ ротации журналов, все еще ожидаемый программами журналирования, такими как syslog-ng, и который иллюстрируется инструментами, такими как logrotateупомянутый djangofanв другом ответе здесь, несколько более случайен. Один запускает cronзадание, которое периодически переименовывает файлы журнала, и перезапускает демон ведения журнала (с использованием любого супервизора демона, на котором он работает). Проблема с этим, конечно, заключается в том, что он не обеспечивает ограничение общего размера. В медленные недели можно получить N очень маленьких ежедневных файлов журнала, в то время как в загруженные дни можно получить 1 очень большой файл журнала, который значительно превышает ограничение по размеру.
Вот почему более поздние и лучшие инструменты, такие как multilogи svlogdимеют параметры конфигурации размера файла, конечно же, сами проверяют размеры файла журнала. Мир узнал, что опрос журналов по расписанию с cronзаданиями или даже с logrotateдемоном оставляет окна для определения неправильного размера, и что это подходящее место для этих проверок, и поэтому строго применяют ограничения, определяемые администратором, чтобы файлы журналов никогда не поглощают раздел, на котором они находятся, в программе, которая на самом деле записывает файлы.