Skip to content

getbyid/pm2-rotatelogs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PM2 Rotate Logs

PM2 позволяет запускать приложение Node.js в фоне, распределять нагрузку между ядрами процессора, записывать стандартный вывод в файлы и прочее. Со временем файлы логов разрастаются, их надо дробить и чистить.

Почему не годится рекомендуемый модуль pm2-logrotate:

  • делит лог по размеру, а не по периоду времени
  • висит в памяти отдельным процессом
  • не заработал в кластере, что-то делал только с логами одного воркера

Нужен другой способ разделения логов PM2 по периодам, независимо от размера.

Предлагаемый скрипт запускается извне по расписанию (cron):

  • подключается к pm2, для каждого воркера переименовывает накопившийся лог
  • пересоздаёт логи через pm2 reloadLogs
  • удаляет логи старше заданного периода (10 недель по-умолчанию)

Единственный необязательный аргумент скрипта задаёт время хранения логов в виде строки "число + буква", примеры:

  • 6m = 6 месяцев, m значит month
  • 10w = 10 недель, w значит week (будет по умолчанию, если аргумент не задан)
  • 7d = 7 дней, d значит day
  • 120s = 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

Запуск через cron (FreeBSD)

Каждую пятницу в 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

About

Split PM2 log files by time range

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published