PM2 позволяет запускать приложение Node.js в фоне, распределять нагрузку между ядрами процессора, записывать стандартный вывод в файлы и прочее. Со временем файлы логов разрастаются, их надо дробить и чистить.
Почему не годится рекомендуемый модуль pm2-logrotate:
- делит лог по размеру, а не по периоду времени
- висит в памяти отдельным процессом
- не заработал в кластере, что-то делал только с логами одного воркера
Нужен другой способ разделения логов PM2 по периодам, независимо от размера.
Предлагаемый скрипт запускается извне по расписанию (cron):
- подключается к pm2, для каждого воркера переименовывает накопившийся лог
- пересоздаёт логи через pm2 reloadLogs
- удаляет логи старше заданного периода (10 недель по-умолчанию)
Единственный необязательный аргумент скрипта задаёт время хранения логов в виде строки "число + буква", примеры:
6m
= 6 месяцев, m значит month10w
= 10 недель, w значит week (будет по умолчанию, если аргумент не задан)7d
= 7 дней, d значит day120s
= 120 секунд, s значит second (удобно при отладке)
Когда период времени задан в днях или неделях - время не учитывается. Когда период задан в месяцах - не учитывается и число месяца, чтобы хранились файлы за полный месяц.
Если указан неправильный аргумент, никакие файлы удаляться не будут.
Устанавливаем тестовое приложение:
$ npm i
Запускаем кластер:
$ pm2 start ecosystem.config.js
Видим логи:
$ ls ~/.pm2/logs/
TEST-APP-error-0.log TEST-APP-error-1.log TEST-APP-error-2.log TEST-APP-error-3.log
TEST-APP-out-0.log TEST-APP-out-1.log TEST-APP-out-2.log TEST-APP-out-3.log
Не останавливая кластер, запускаем скрипт:
$ node pm2-rotatelogs.js
Number of applications: 4
TEST_APP /home/user/.pm2/logs/2021-08-18T??-??-??_TEST-APP-out-0.log
TEST_APP /home/user/.pm2/logs/2021-08-18T??-??-??_TEST-APP-out-1.log
TEST_APP /home/user/.pm2/logs/2021-08-18T??-??-??_TEST-APP-out-2.log
TEST_APP /home/user/.pm2/logs/2021-08-18T??-??-??_TEST-APP-out-3.log
Delete files older than 2021-06-09 (UTC) from /home/user/.pm2/logs:
2021-08-18T??-??-??_TEST-APP-out-0.log skip
2021-08-18T??-??-??_TEST-APP-out-1.log skip
2021-08-18T??-??-??_TEST-APP-out-2.log skip
2021-08-18T??-??-??_TEST-APP-out-3.log skip
OK
Не забываем удалить тестовый кластер:
$ pm2 delete TEST_APP
Каждую пятницу в 07:15
$ crontab -e
15 7 * * 5 node ~/api/current/pm2-rotatelogs.js
1-го числа каждого месяца в 07:55, логи хранить полгода (6 месяцев)
$ crontab -e
55 7 1 * * node ~/api/current/pm2-rotatelogs.js 6m